2011-06-18 9 views
12
<?php 
function ReturnArray() { 
    return array('a' => 'f', 'b' => 'g', 'c' => 'h', 'd' => 'i', 'e' => 'j'); 
} 

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

Explique cuál es la lógica y el paso de calcular con esos $ {! 1} en la resolución anterior que funciona bien.Explique este fragmento de PHP para mí: devolver matriz e inmediatamente referenciar un índice

+10

Ganador del premio PHP esotérica es para ... ¿Qué – Dan

+1

las respuestas parecen faltar es que esto es una solución por el hecho de que 'function() [subscript]' es en realidad (y me gustaría estar inventando esto) un * error de sintaxis * en PHP. –

Respuesta

6

Comencemos con algunos conceptos básicos. En PHP, algo como hello evaluará a la cadena "hello". Para hacer referencia a una variable, puede usar esta sintaxis: ${expr}. También hay una abreviatura para esto, $foo, que aproximadamente evaluará a esto: ${"foo"}.

Además, probablemente sepa que puede asignar múltiples variables a la vez: $a=$b=$c='hello';, por ejemplo. Esto asignará $a, $b y $c a 'hello'. Esto en realidad se representa como $a=($b=($c='hello')));. $foo=value es una expresión que, después de establecer $foo, evaluará a value.

Su estado de código es el siguiente:

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

El primero que hace, obviamente, es llamar a ReturnArray. A continuación, evalúa !1, que se evalúa como falso. El ${!1} por lo tanto hace una variable con el nombre false, aunque no es una cadena (?!). Después de eso, aplica una operación no a la matriz. Todas las matrices no vacías son verdaderas, por lo que la operación no lo cambia a false. Luego usa esa sintaxis ${} nuevamente para recuperar la variable llamada false. A continuación, utiliza un acceso de matriz para recuperar el valor en la matriz para la clave 'a'.

Espero que tenga sentido.

+0

Mi respuesta es más correcta, el nombre de la variable no es 'falso', pero NULL (no como cadena, como valor NULL) :) –

+0

@OZ_: Puede ser' NULL', pero también se puede hacer referencia a 'false' . – icktoofay

0

Mientras tanto he localizado una respuesta así que publicar aquí:

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

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

${!${false}=ReturnArray()}['a'] 
false resolves to... I don't know. Let's 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 
1

${!1} evalúa a ${false}
!${false = ReturnArray()} evalúa a $true = array('a' => 'f', /* etc */).
echo $true['a'] produce 'f' como 'f' corresponde al índice 'a'

tengo curiosidad ahora, ¿qué es esto?

+0

no tenemos esta clave en la matriz. Y $ {0} no nos da ningún identificador. –

+0

Lo siento, correcto. Pero '$ {! 1} = 'foo'' seguido con un' print_r (get_defined_vars()) 'da como resultado' [] => foo' en la parte inferior del volcado. Er ir, es un identificador 'falso'? – Dan

+1

Siempre use 'var_dump()'; 'print_r()' no puede mostrar un booleano correctamente. –

0

En mi humilde opinión, es principalmente ruido puro. El código asigna una matriz a una variable y luego recupera la clave a, que obviamente es f. Solo uso booleanos para generar los nombres de variables intermedias y dejar que PHP los emita a cadenas.

2
  1. !1 = false
  2. ${!1} = NULL
  3. ${!1} = ReturnArray() = array ('a' => 'f', 'b' => 'g', 'c' => 'h', ' d'=> 'i', 'e'=> 'j')
  4. por lo que ahora $ NULL contiene array
    y otra vez vemos construcción ${!(condition) que significa $ NULL (véanse los puntos primero y segundo), por lo que puede convertir a:
  5. $NULL['a'] (y $ NULL contiene matriz)

Puede comprobar fácilmente esto:
print_r(${NULL}); - verá matriz;)

Cuestiones relacionadas