Подтвердить что ты не робот

Объясните этот фрагмент PHP для меня: возвращаем массив и сразу ссылаемся на индекс

<?php
function ReturnArray() {
    return array('a' => 'f', 'b' => 'g', 'c' => 'h', 'd' => 'i', 'e' => 'j');
}

echo ${!${!1}=ReturnArray()}['a']; // 'f'
?>

Пожалуйста, объясните, что логика и шаг вычисления с этими ${! 1} в приведенном выше разрешении работают хорошо.

4b9b3361

Ответ 1

Давайте начнем с некоторых основ. В PHP что-то вроде hello будет оценивать строку "hello". Чтобы ссылаться на переменную, вы можете использовать этот синтаксис: ${expr}. Для этого также сокращенно $foo, который будет примерно соответствовать этому: ${"foo"}.

Кроме того, вы, вероятно, знаете, что вы можете сразу назначить несколько переменных: $a=$b=$c='hello';, например. Это назначит $a, $b и $c на 'hello'. Это фактически представлено как $a=($b=($c='hello')));. $foo=value - это выражение, которое после установки $foo будет оцениваться как value.

Ваша инструкция кода выглядит следующим образом:

echo ${!${!1}=ReturnArray()}['a'];

Первое, что он делает, очевидно, это вызов ReturnArray. Затем он оценивает !1, который вычисляет значение false. Следовательно, ${!1} делает переменную с именем false, но не строкой (?!). После этого он применяет не операцию к массиву. Все непустые массивы являются правдивыми, поэтому операция не меняет ее на false. Затем он использует этот синтаксис ${} для получения переменной с именем false. Затем он использует доступ к массиву для извлечения значения в массиве для ключа 'a'.

Я надеюсь, что это имело смысл.

Ответ 2

  • !1= false
  • ${!1}= NULL
  • ${!1} = ReturnArray()= array ('a' = > 'f', 'b' = > 'g', 'c' = > 'h', 'd' = > 'i', 'e' = > 'j')
  • так что теперь $NULL содержит массив и снова мы видим конструкцию ${!(condition), которая означает $NULL (см. первую и вторую точки), поэтому мы можем преобразовать ее в:
  • $NULL['a'] (и $NULL содержит массив)

Вы можете легко проверить это:
print_r(${NULL}); - вы увидите массив;)

Ответ 3

${!1} оценивается как ${false}
!${false = ReturnArray()} оценивается как $true = array('a' => 'f', /* etc */).
echo $true['a'] создает 'f', поскольку 'f' соответствует индексу 'a'

Мне сейчас интересно, что это такое?

Ответ 4

Между тем у меня есть ответ, поэтому я размещаю его здесь:

echo ${!${!1}=ReturnArray()}['a'];

${!${!1}=ReturnArray()}['a']
 !1 resolves to false.

${!${false}=ReturnArray()}['a']
 false resolves to... I don't know. Let just say false resolves to a variable "a".

${!$a=ReturnArray()}['a']
 $a is now the array. The ! changes the returned array into the boolean false (like: if (!$handle = fopen('x', 'r')) { echo 'connection failed' }.

${false}['a']
 I don't know what false resolves to, but we're using again variable "a".

$a['a'] // this is trivial

Ответ 5

ИМХО, это в основном чистый шум. Код присваивает массив переменной, а затем извлекает ключ a, который, очевидно, f. Я просто использую booleans для генерации промежуточных имен переменных и позволяю PHP применять их к строкам.