Доступ к элементу массива при возврате из функции - PullRequest
9 голосов
/ 04 сентября 2010

Некоторые поиски в Google (и мой собственный опыт) показывают, что в PHP вы не можете получить элемент массива, если он возвращен из вызова функции в той же строке. Например, вы не можете сделать:

echo getArray()[0];

Тем не менее, я натолкнулся на небольшой хитрость:

echo ${!${false}=getArray()}[0];

Это на самом деле работает. Проблема в том, что я не знаю , почему это работает. Если бы кто-то мог объяснить, это было бы здорово.

Спасибо.

Ответы [ 3 ]

10 голосов
/ 04 сентября 2010
echo ${!${false}=getArray()}[0];

Вот как это работает, шаг за шагом

${false}=getArray()

присваивает результат getArray переменной с пустым именем ('' или ноль будет работать вместо false)

!${false}=getArray()

отменяет указанное выше значение, превращая его в логическое значение false

 ${!${false}=getArray()}

преобразует предыдущее (ложное) значение в (пустую) строку и использует эту строку в качестве имени переменной. То есть это переменная из шага 1, равная результату getArray.

${!${false}=getArray()}[0];

принимает индекс этой «пустой» переменной и возвращает элемент массива.

Еще несколько вариаций той же идеи

echo ${1|${1}=getArray()}[1];
echo ${''.$Array=getArray()}[1];

function p(&$a, $b) { $a = $b; return '_'; }
echo ${p($_, getArray())}[1];

Относительно того, почему getArray()[0] не работает, это потому, что команда php понятия не имеет, как заставить его работать.

3 голосов
/ 04 сентября 2010

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

$hello = 'test';
echo ${"hello"};

Зачем это нужно, это необходимо, если вы хотите превратить строку или возвращаемое значение впеременная, пример

${$_GET['var']} = true;

Это плохая практика и никогда не следует использовать IMO.

вам следует использовать Objects, если вы хотите напрямую запускать функции, например

function test()
{
   $object = new stdClass();
   $object->name = 'Robert';

   return $object;
}
echo test()->name;
2 голосов
/ 12 декабря 2013

Следует отметить, что вы можете сделать это с PHP 5.4.Из руководства по разыменованию массива:

Начиная с PHP 5.4, можно напрямую разыменовать массив в результате вызова функции или метода.Раньше это было возможно только с использованием временной переменной.

Пример:

function theArray() {
    return range(1, 10);
}

echo theArray()[0];
// PHP 5.4+: 1
// PHP -5.4: null

До PHP 5.4: Попытка получить доступ к ключу массива, который не был определен, являетсяаналогично доступу к любой другой неопределенной переменной: будет выдано сообщение об ошибке уровня E_NOTICE, и результатом будет NULL.

Вручную:

...