В php мне часто нужно отображать переменную с помощью массива ... но я не могу сделать это в один слой. ср пример:
// 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);
Массив теперь должен быть уничтожен автоматически.
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.
Или как-то так, если вам нужно значение массива в переменной
$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_ * . Но я уверяю вас, что это абсолютно лишнее сравнения того, чего вы хотите достичь.
Например, вы можете использовать что-то вроде следующего, но это не элегантное решение, и я не уверен насчет производительности этого;
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