Сведения о вопросе

SOON

01:50, 23rd August, 2020

Теги

php   arrays   coding-style    

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

Просмотров: 459   Ответов: 9

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

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



  Сведения об ответе

repe

03:15, 18th August, 2020

Технический ответ заключается в том, что Grammar языка PHP допускает только подстрочную нотацию в конце переменных выражений , а не выражений вообще, как это работает в большинстве других языков. Я всегда рассматривал это как недостаток в языке, потому что можно иметь grammar, который однозначно разрешает нижние индексы против любого выражения. Однако это может быть так, что они используют негибкий генератор синтаксического анализа или просто не хотят нарушать какую-то обратную совместимость.

Вот еще несколько примеров недопустимых индексов для допустимых выражений:

$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.


  Сведения об ответе

lool

02:41, 16th August, 2020

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

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


  Сведения об ответе

SEEYOU

11:00, 8th August, 2020

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

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

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

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

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

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

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


  Сведения об ответе

dumai

00:47, 29th August, 2020

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

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

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

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


  Сведения об ответе

ASSembler

16:03, 25th August, 2020

function doSomething()
{
    return $somearray;
}

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


  Сведения об ответе

baggs

21:06, 1st October, 2020

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

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


  Сведения об ответе

ASSembler

23:46, 13th August, 2020

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

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


  Сведения об ответе

pumpa

20:25, 28th August, 2020

Есть несколько 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 помощники массива


  Сведения об ответе

dumai

02:49, 13th August, 2020

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться