2011-05-25 14 views
12

Uno de los ejemplos de un bucle foreach en PHP esPHP bucle foreach ejemplo confusión

foreach ($row as $key => $value) { 
    // somecode 
} 

Estoy teniendo problemas para entender lo que el => está haciendo. ¿Alguien puede explicarme cómo es "visto" o evaluado por PHP? ¿Cuál es el orden de operación, qué valor está asignado a $key?

Lo que lo hace diferente de:

foreach ($row as $value) { 
    // somecode 
} 

?

que lógicamente pensé que el valor de $value sería asignado a $key, entonces sería asignado como una fila de $row, pero que es obviamente incorrecto ...

+0

posible duplicado de [Referencia - ¿Qué significa este símbolo en PHP?] (Http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol-mean-in-php) –

Respuesta

2

Los dos ejemplos son los mismos, pero el primero agrega una definición de la clave que está mirando actualmente, y la nombra $ clave.

Compare a una definición array(), como array('key' => 'value')

Si se utiliza el primer método, usted tiene $ clave que contiene 'clave' y en el segundo ejemplo no lo hace.

9

matrices de PHP se almacenan como pares de claves y valores:

$arr = array(
    'key1' => 'value1', 
    'key2' => 'value2' 
); 

La sintaxis estándar foreach obtiene sólo los valores:

foreach ($arr as $value) { 
    // value1, value2 
} 

La sintaxis alternativa le permite obtener las claves, así:

foreach ($arr as $key => $value) { 
    // $key is "key1", then "key2" 
    // $value is "value1" then "value2" 
} 

Ver el manual entry for foreach.

0
foreach ($row as $key => $value) { ..somecode..} 

Lo anterior se utiliza en una matriz asociativa, tales como:

array("a" => 1, "b" => 2, "c" => 3); 

En el caso anterior, la variable clave $ se le asigna el primer valor de [a en la primera iteración, b en el segundo, c en el bucle final] (llamada clave) y la variable $ value tiene asignado el segundo valor [1 en la primera iteración, 2 en el segundo, 3 en la final] (llamado valor)

Si se omite la asignación de clave, el valor de $ aún se le asignará el segundo valor.

0

Opcodes para foreach con valor de clave y

:
BCDF9C 0005: FE_RESET    (CV 0 ($array), u) -> VAR 2 
BCE014 0005: FE_FETCH    (VAR 2, u) -> VAR 3 
BCE08C 0005: OP_DATA    (u VAR 0 &(0+2208F38), u VAR 0 &(0+2208F38)) -> TMP_VAR 5 &(C8+2208F39) 
BCE104 0005: ASSIGN    (CV 2 ($value), VAR 3) -> VAR 4 
BCE17C 0005: ASSIGN    (CV 1 ($key), TMP_VAR 5) -> VAR 6 
BCE1F4 0005: JMP     (u &(BCDFA0+4)) 
BCE26C 0005: SWITCH_FREE   (VAR 2) 

códigos de operación para foreach con sólo un valor:

BCE2E4 0007: FE_RESET    (CV 0 ($array), u) -> VAR 7 
BCE35C 0007: FE_FETCH    (VAR 7, u) -> VAR 8 
BCE3D4 0007: OP_DATA    (u VAR 0 &(0+2208F38), u VAR 0 &(0+2208F38)) -> u VAR 0 &(0+2208F38) 
BCE44C 0007: ASSIGN    (CV 2 ($value), VAR 8) -> VAR 9 
BCE4C4 0007: JMP     (u &(BCE2E8+B)) 
BCE53C 0007: SWITCH_FREE   (VAR 7) 

Lo siento por la representación de código de operación extraña.

Básicamente, la versión sin clave asigna dos variables menos por iteración.No asigna la clave y la variable temporal, sino que simplemente asigna la var directamente.

20

Entiendo que es un poco complicado, tuve problemas para entenderlo cuando comencé a usarlo. Cuanto más lo use, más tiene más sentido.

Su gama se vería así:

// "key" "value" 
// |  | 
// V  V 
$row['1'] = 'item1'; 
$row['2'] = 'item2'; 
$row['3'] = 'item3'; 
$row['4'] = 'item4'; 

teclas pueden ser cualquier cosa, que no necesitan ser números. ¡De esta forma puede recorrer todos los elementos de la matriz sin necesidad de conocer la clave!

Así, el primer ejemplo se puede explicar de la siguiente manera:

//   +--- The ARRAY where all of your data is 
//   | 
//   |  +----- The KEY to access that element of the array 
//   |  | 
//   |  |  +----- The VALUE of that element 
//   |  |  | 
//   V  V  V 
foreach ($row as $key => $value){ 
    if($row[$key] == $value){ // this statement is always true 
     echo "true AGAIN!"; // and thus will always print this line 
    } 
} 

En lo que a mi entender va la => no es realmente un operando de tipo, que sólo se utiliza para completar la estructura del bucle foreach .

+0

Me encanta el dibujo, pero tu ejemplo es incorrecto '$ key' en realidad contendría valores, no claves. – notJim

+0

Gracias @notJim, y tienes razón, mi error ... Repararé mi respuesta. Gracias por señalar eso. Escribí el código en la parte superior de mi cabeza y no lo revisé primero. – CenterOrbit

+0

+1 para los dibujos – marcio

0

Desde el PHP Documentation:

Para matrices, asignar un valor a una clave denominada se realiza utilizando el "=>" operador. La precedencia de este operador es la misma que la de los otros operadores de asignación .

Esta pregunta también me dio curiosidad en cuanto al nombre del operador => en PHP.

Como puede ver, la documentación no le da un nombre explícitamente. Esto me llevó a buscar canales PHP en IRC. El consenso general es que se llama operador cohete.