PHP: доступ к массиву на лету

В php мне часто нужно сопоставить переменную с помощью массива … но я не могу сделать это в одном лайнере. Пример cf:

// the following results in an error: echo array('a','b','c')[$key]; // this works, using an unnecessary variable: $variable = array('a','b','c'); echo $variable[$key]; 

Это второстепенная проблема, но она продолжает прослушивать время от времени … Мне не нравится тот факт, что я использую переменную ни за что;)

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

 $variable = array('a','b','c'); echo $variable[$key]; unset($variable); 

Или вы могли бы написать небольшую функцию:

 function indexonce(&$ar, $index) { return $ar[$index]; } 

и назовите это:

 $something = indexonce(array('a', 'b', 'c'), 2); 

Теперь массив должен быть уничтожен автоматически.

Технический ответ заключается в том, что грамматика языка PHP допускает только нотацию в конце выражений переменных, а не выражений вообще, как это работает на большинстве других языков. Я всегда рассматривал его как недостаток в языке, потому что можно иметь грамматику, которая однозначно разрешает индексы против любого выражения. Однако может случиться так, что они используют негибкий генератор синтаксического анализатора или просто не хотят нарушать некоторую обратную совместимость.

Вот еще несколько примеров недопустимых индексов для допустимых выражений:

 $x = array(1,2,3); print ($x)[1]; //illegal, on a parenthetical expression, not a variable exp. function ret($foo) { return $foo; } echo ret($x)[1]; // illegal, on a call expression, not a variable exp. 

Это называется разыменованием массива. Он добавлен в php 5.4. http://www.php.net/releases/NEWS_5_4_0_alpha1.txt

update [2012-11-25]: с PHP 5.5 разыменовывание было добавлено к группам / строкам, а также к массивам

Это может быть не напрямую связано. Но я пришел к этому сообщению, найдя решение этой конкретной проблемы.

Я получил результат от функции в следующем виде.

 Array ( [School] => Array ( [parent_id] => 9ce8e78a-f4cc-ff64-8de0-4d9c1819a56a ) ) 

то, что я хотел, было значением parent_id «9ce8e78a-f4cc-ff64-8de0-4d9c1819a56a». Я использовал такую ​​функцию и получил ее.

 array_pop( array_pop( the_function_which_returned_the_above_array() ) ) 

Итак, это было сделано в одну строку 🙂 Надеюсь, это было бы полезно кому-то.

 function doSomething() { return $somearray; } echo doSomething()->get(1)->getOtherPropertyIfThisIsAnObject(); 

на самом деле, есть изящное решение 🙂 Ниже будет назначен третий элемент массива, возвращаемый myfunc, на $ myvar:

 $myvar = array_shift(array_splice(myfunc(),2)); 

Или что-то вроде этого, если вам нужно значение массива в переменной

 $variable = array('a','b','c'); $variable = $variable[$key]; 

Есть несколько oneliners, которые вы могли бы придумать, используя функции php array_ * . Но я заверяю вас, что, делая это, мы имеем полное избыточное сравнение того, чего вы хотите достичь.

Например, вы можете использовать что-то вроде следующего, но это не изящное решение, и я не уверен в производительности этого;

  array_pop ( array_filter( array_returning_func(), function($key){ return $key=="array_index_you_want"? TRUE:FALSE; },ARRAY_FILTER_USE_KEY ) ); 

если вы используете инфраструктуру php и застряли в старой версии php, большинство фреймворков помогают библиотекам.

пример: Помощники массива Codeigniter