2013-04-24 6 views
1

В PHP я следующий построитьВозможно ли встроить доступ к массиву PHP?

$a = array(-1 => '-', 0 => '?', 1 => '+')[1]; 

, который дает ошибку синтаксиса. Можно ли все это делать в одной удобной строке, избегая множественных if/else clases или операторов switch/select? Я думал, на питона, где эта работа хорошо:

a = {-1:'-', 0:'?', 1:'+'}[1] 
+0

Разрушение массива имелось с PHP 5.4 –

+0

Почему бы просто не использовать 'print '?''? Выглядит проще .. :) – hek2mgl

+0

@JohnConde Nice (новости для меня) - перечислено как «[разыменование разметки функций] (http://php.net/manual/en/migration54.new-features.php) ' – searlea

ответ

6

Он работает в PHP но только 5.5.0alpha1 - 5.5.0beta2 вы должны использовать переменные сейчас, пока стабильная версия не выпущена.

$array =  array(-1 => '-', 0 => '?', 1 => '+'); 
print $array[1]; 

Еще интересную вещь, что PHP поддержка в PHP 5.4Function Array Dereferencing, что означает просто оборачивать ваш массив в функции будет заставить его работать

function __($_) { 
    return $_; 
} 

print __(array(-1 => '-', 0 => '?', 1 => '+'))[1]; 
+0

Хорошо, я вижу. Я буду использовать ваше предложение, так как мне все равно нужно выполнить эту работу в PHP4 ... – Alex

+1

+1 Я не знал этого, спасибо – AlexP

+0

@AlexP приветствуется – Baba

1

Вы можете создать вспомогательную функцию, так что вы можете сделать это в одном линия.

function array_get($array, $key) 
{ 
    return $array[$key] 
} 

print array_get(array(-1 => '-', 0 => '?', 1 => '+'), 1); 
0

Однолинейная путь:

$a = array_pop(array_slice(array(-1 => '-', 0 => '?', 1 => '+'), 1, 1)); 

Или в общем случае:

$x = array_pop(array_slice(foo(), $offset, 1)); 

Который, конечно, ужасно.

+0

'array_pop' требует переменную - вы не используете ее здесь. Оберните его в круглые скобки, чтобы обмануть PHP здесь, хотя это, вероятно, нестабильно. – hakre

+0

См. Также: [Круглые скобки, изменяющие семантику результата вызова функции] (http://stackoverflow.com/q/6726589/367456) – hakre

+0

@hakre: Я тестировал его на PHP 5.3 и, похоже, работает нормально, без ссылки на переменную обязательный. – searlea

0

Независимо от которых PHP версия, если вы после этого, вы должны иметь что-то в наборе функций:

function deref($subject) { 
    return $subject; 
} 

function deref_array($array, $key) { 
    return $array[$key]; 
} 

Эта пара очень примитивных функций позволяет говорить PHP парсер чаще всего то, что вам нужно и означают:

$a = deref_array(array(-1 => '-', 0 => '?', 1 => '+'), 1); 

В вашем конкретном случае вам нужна только вторая функция, но первая часто также полезна.

Смежные вопросы