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

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

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

Ответ 1

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

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

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

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

и назовите это с помощью:

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

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

Ответ 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.

Ответ 3

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

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

Ответ 4

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

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

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

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

Ответ 5

function doSomething()
{
    return $somearray;
}

echo doSomething()->get(1)->getOtherPropertyIfThisIsAnObject();

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

Можно найти несколько дополнительных элементов, используя функции 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