2009-07-21 7 views
5
$posts = array(
"message" => 'this is a test message' 
); 

foreach ($posts as $post) { 
    echo $post['message']; 
} 

¿Por qué el código anterior solo muestra la primera letra del mensaje? "t".Array y foreach

Gracias!

+0

Realmente me sorprende que imprima algo en absoluto ... No debería poder indexar en una cadena utilizando un parámetro asociativo (es decir. una cadena) ... Diría que este comportamiento probablemente indefinido en el mejor de los casos. –

+1

@Matthew: La explicación para eso está en mi respuesta. – soulmerge

Respuesta

12

foreach toma cada elemento de la matriz y lo asigna a la variable. Para obtener los resultados que supongo que usted está esperando sólo tiene que hacer:

foreach ($posts as $post) { 
    echo $post; 
} 

Los detalles de por qué su código no funcionó: $post sería el contenido del elemento de la matriz - en este caso una cadena. Dado que PHP no es inflexible de tipos/soporta el tipo de malabares, puede de hecho trabajar con una cadena como si se tratara de una matriz, y llegar a cada carácter en la secuencia:

foreach ($posts as $post) { 
    echo $post[0]; //'t' 
    echo $post[1]; //'h' 
} 

Obviamente $post['message'] por lo tanto, no es válido elemento, y no hay una conversión explícita de (string)'message' a int, por lo que esto evalúa a $post[0].

+1

((int) 'mensaje') está bastante bien definido: http://de.php.net/manual/en/language.types.string.php#language.types.string.conversion – soulmerge

+0

Muy cierto: mala elección de vocabulario de mi parte para expresar lo que quise decir – Ian

6
# $posts is an array with one index ('message') 
$posts = array(
    "message" => 'this is a test message' 
); 

# You iterate over the $posts array, so $post contains 
# the string 'this is a test message' 
foreach ($posts as $post) { 
    # You try to access an index in the string. 
    # Background info #1: 
    # You can access each character in a string using brackets, just 
    # like with arrays, so $post[0] === 't', $post[1] === 'e', etc. 
    # Background info #2: 
    # You need a numeric index when accessing the characters of a string. 
    # Background info #3: 
    # If PHP expects an integer, but finds a string, it tries to convert 
    # it. Unfortunately, string conversion in PHP is very strange. 
    # A string that does not start with a number is converted to 0, i.e. 
    # ((int) '23 monkeys') === 23, ((int) 'asd') === 0, 
    # ((int) 'strike force 1') === 0 
    # This means, you are accessing the character at position ((int) 'message'), 
    # which is the first character in the string 
    echo $post['message']; 
} 

Lo que posiblemente quiere decir ya sea éste:

$posts = array(
    array(
     "message" => 'this is a test message' 
    ) 
); 
foreach ($posts as $post) { 
    echo $post['message']; 
} 

O esto:

$posts = array(
    "message" => 'this is a test message' 
); 
foreach ($posts as $key => $post) { 
    # $key === 'message' 
    echo $post; 
} 
+0

+1 para información de fondo muy buena (: – peirix

+0

Eso no está realmente resolviendo el problema, que es una concepción errónea sobre cómo funciona foreach con las matrices. – Ian

+0

'¿Cómo resolver el problema?' No puedo resolver el problema sin saber qué es lo que quiere lograr con su script, solo puedo responder su pregunta y dar ejemplos de trabajo. Pero creo que la información aquí es suficiente para hacer que su script funcione. – soulmerge

4

que me gustaría añadir a la respuesta algo de Ian: si quieres alguna manera de acceder a la clave del valor, utilice esto:

foreach ($posts as $key => $post) { 
    echo $key . '=' . $post; 
} 

Resultado:

message=this is a test message