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

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

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

16.08.2008 12:42:54
Работает как PHP v5.4, недопустимый синтаксис вPHP <= v5.3
recursion.ninja 15.01.2014 20:56:44
9 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

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

и назовите это с:

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

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

16
16.08.2008 12:55:29
@onnodb, Strict Standards: Only variables should be passed by referenceдля вашей функции indexonce. Почему вы добавляете &ссылку?
Pacerier 9.12.2014 11:51:37

Технический ответ заключается в том, что грамматика языка 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.
38
21.05.2012 17:32:41
Было предложение об изменении, по крайней мере, для второго синтаксиса, но оно было отклонено: wiki.php.net/rfc/functionarraydereferencing
Max 26.05.2010 11:54:16
Теперь статус изменен на принятый wiki.php.net/rfc/functionarraydereferencing
Michiel van Oosterhout 20.09.2010 19:53:38
Этот ответ больше не точен. Начиная с версии
Mbrevda 25.11.2012 11:01:54
@ Джон, почему ты сказал, что это "сломает какую-то обратную совместимость"? Они же ввели его в 5,4 и так, какая задом наперед проблемы совместимости есть?
Pacerier 9.12.2014 11:36:13

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

$variable = array('a','b','c');
$variable = $variable[$key];
0
18.08.2012 08:55:52

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

$myvar = array_shift(array_splice(myfunc(),2));
1
26.05.2010 11:50:04
Умный? да! Элегантный? нет.
Tom Auger 9.12.2010 00:03:47
function doSomething()
{
    return $somearray;
}

echo doSomething()->get(1)->getOtherPropertyIfThisIsAnObject();
2
18.08.2012 08:57:05
Как вы могли бы сделать get(1)на массиве? Неустранимая ошибка: вызов функции-члена get () для необъекта в file.php в строке 21
Pacerier 9.12.2014 11:40:01

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

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

23
25.11.2012 11:03:56

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

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

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
23.12.2011 07:36:14
Это работает только с последним значением, и вы будете удалять значение из исходного массива .
Pacerier 9.12.2014 11:37:51

Есть несколько 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
24.02.2016 11:55:27

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

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

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

0
10.08.2018 06:21:39