PHP: доступ к значению массива на лету - PullRequest
48 голосов
/ 16 августа 2008

В 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];

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

Ответы [ 9 ]

38 голосов
/ 28 августа 2008

Технический ответ заключается в том, что Грамматика языка 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.
23 голосов
/ 25 октября 2011

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

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

16 голосов
/ 16 августа 2008

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

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

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

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

и позвоните по этому номеру:

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

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

5 голосов
/ 23 декабря 2011

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

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

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() ) )

Итак, это было сделано в одну строку :) Надеюсь, это кому-нибудь пригодится.

2 голосов
/ 18 февраля 2011
function doSomething()
{
    return $somearray;
}

echo doSomething()->get(1)->getOtherPropertyIfThisIsAnObject();
1 голос
/ 26 мая 2010

на самом деле, есть элегантное решение :) Следующее назначит 3-й элемент массива, возвращаемого myfunc, $ myvar:

$myvar = array_shift(array_splice(myfunc(),2));
0 голосов
/ 10 августа 2018

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

echo $var=($var=array(0,1,2,3))?$var[3]:false;

таким образом, вы не сохраняете массив только переменной. и вам не нужны дополнительные функции, чтобы сделать это ... Если эта строка используется в функции, она будет автоматически уничтожена в конце, но вы также можете уничтожить ее самостоятельно, как сказано с помощью unset позже в коде, если она не используется в функции.

0 голосов
/ 24 февраля 2016

Есть несколько 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

0 голосов
/ 13 августа 2009

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

$variable = array('a','b','c');
$variable = $variable[$key];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...