Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

$something = indexonce(array('a', 'b', 'c'), 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.

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

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

function doSomething()
{
    return $somearray;
}

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top