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

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

Работает с PHP v5.4, недопустимый синтаксис в PHP <= v5.3

recursion.ninja 16.01.2014 00:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
49
1
18 983
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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);

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

@onnodb, Strict Standards: Only variables should be passed by reference для вашей функции indexonce. Зачем вы добавляете ссылку &?

Pacerier 09.12.2014 14:51

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

Было предложение изменить как минимум второй синтаксис, но оно было отклонено: wiki.php.net/rfc/functionarraydereferencing

Max 26.05.2010 15:54

Статус теперь изменен на принятый wiki.php.net/rfc/functionarraydereferencing

Michiel van Oosterhout 20.09.2010 23:53

Этот ответ уже не точен. Начиная с 5.5, PHP поддерживает разыменование констант / массивов / строк wiki.php.net/rfc/constdereference

Mbrevda 25.11.2012 15:01

@John, почему ты сказал, что это "нарушит некую обратную совместимость"? Они сделал представили это в 5.4, так что какие проблемы с обратной совместимостью существуют?

Pacerier 09.12.2014 14:36

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

$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

Pacerier 09.12.2014 14:40

Это называется разыменованием массива. Он был добавлен в 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() ) )

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

Это работает только с последним значением, и вы удалите значение из исходный массив.

Pacerier 09.12.2014 14:37

Есть несколько oneliners, которые вы могли бы придумать, используя функции php множество_*. Но я уверяю вас, что это совершенно лишнее, если сравнивать то, чего вы хотите достичь.

Пример, вы можете использовать что-то вроде следующего, но это не изящное решение, и я не уверен в производительности этого;

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

Другие вопросы по теме