В php мне часто нужно сопоставить переменную с помощью массива ... но я не могу сделать это в одном лайнере. c.f. пример:
// 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);
Теперь массив должен быть уничтожен автоматически.
@onnodb, Strict Standards: Only variables should be passed by reference для вашей функции indexonce. Зачем вы добавляете ссылку &?
Технический ответ заключается в том, что Грамматика языка 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.
Было предложение изменить как минимум второй синтаксис, но оно было отклонено: wiki.php.net/rfc/functionarraydereferencing
Статус теперь изменен на принятый wiki.php.net/rfc/functionarraydereferencing
Этот ответ уже не точен. Начиная с 5.5, PHP поддерживает разыменование констант / массивов / строк wiki.php.net/rfc/constdereference
@John, почему ты сказал, что это "нарушит некую обратную совместимость"? Они сделал представили это в 5.4, так что какие проблемы с обратной совместимостью существуют?
Или что-то вроде этого, если вам нужно значение массива в переменной
$variable = array('a','b','c');
$variable = $variable[$key];
на самом деле есть элегантное решение :) Следующее будет назначать 3-й элемент массива, возвращаемого myfunc, переменной $ myvar:
$myvar = array_shift(array_splice(myfunc(),2));
function doSomething()
{
return $somearray;
}
echo doSomething()->get(1)->getOtherPropertyIfThisIsAnObject();
Как вы могли сделать get(1) на массиве? Неустранимая ошибка: вызов функции-члена get () для не-объекта в file.php в строке 21
Это называется разыменованием массива. Он был добавлен в php 5.4. http://www.php.net/releases/NEWS_5_4_0_alpha1.txt
обновление [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() ) )
Итак, это было сделано в одну строчку :) Надеюсь, это будет кому-то полезно.
Это работает только с последним значением, и вы удалите значение из исходный массив.
Есть несколько oneliners, которые вы могли бы придумать, используя функции php множество_*. Но я уверяю вас, что это совершенно лишнее, если сравнивать то, чего вы хотите достичь.
Пример, вы можете использовать что-то вроде следующего, но это не изящное решение, и я не уверен в производительности этого;
array_pop ( array_filter( array_returning_func(), function($key){ return $key= = "array_index_you_want"? TRUE:FALSE; },ARRAY_FILTER_USE_KEY ) );
Если вы используете фреймворк php и застряли на более старой версии php, в большинстве фреймворков есть вспомогательные библиотеки.
пример: помощники массива Codeigniter
хотя тот факт, что разыменование было добавлено в PHP> = 5.4, вы могли бы сделать это в одной строке, используя тернарный оператор:
echo $var=($var=array(0,1,2,3))?$var[3]:false;
таким образом вы не сохраняете в массиве только переменную. и вам не нужны дополнительные функции для этого ... Если эта строка используется в функции, она будет автоматически уничтожена в конце, но вы также можете уничтожить ее самостоятельно, как сказано с unset позже в коде, если она не используется в функции.
Работает с
PHP v5.4, недопустимый синтаксис вPHP <= v5.3