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

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

Pourquoi le code ci-dessus affiche-t-il uniquement la première lettre du message? "t".Array and foreach

Merci! Foreach prend chaque élément du tableau et l'assigne à la variable

+0

Je suis vraiment surpris qu'il imprime quoi que ce soit du tout ... Vous ne devriez pas pouvoir indexer dans une chaîne en utilisant un paramètre associatif (ie. une chaîne) ... Je dirais que c'est probablement un comportement indéfini au mieux. –

+1

@Matthew: L'explication de cela est dans ma réponse. – soulmerge

Répondre

12

Pour obtenir les résultats que je suppose que vous vous attendez avez juste besoin de faire:

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

Les détails quant à la raison pour laquelle votre code ne fonctionne pas: $post serait le contenu de l'élément de tableau - dans ce cas, une chaîne. Parce que PHP n'est pas fortement typé/prend en charge la jonglerie de type, vous pouvez dans le travail de fait avec une chaîne comme si elle était un tableau, et obtenir à chaque caractère dans la séquence:

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

De toute évidence $post['message'] est donc pas valide élément, et il n'y a pas de conversion explicite de (string)'message' à int, donc cela évalue à $post[0].

+1

((int) 'message') est assez bien défini: http://de.php.net/manual/fr/language.types.string.php#language.types.string.conversion – soulmerge

+0

Très vrai: mauvais choix de vocabulaire de ma part pour exprimer ce que je voulais dire – 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']; 
} 

Qu'est-ce que vous voulez peut-être est soit ceci:

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

Ou ceci:

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

+1 pour de l'information d'arrière-plan vraiment sympa (: – peirix

+0

Cela ne résout pas vraiment le problème, ce qui est une mauvaise conception évidente de la façon dont foreach fonctionne avec les tableaux – Ian

+0

'Résoudre le problème'? Je ne peux pas résoudre le problème sans savoir ce qu'il veut accomplir avec son script, je peux seulement répondre à sa question et donner des exemples de travail, mais je pense que les informations ici sont suffisantes pour que son script fonctionne. – soulmerge

4

J'ajouterais à la chose réponse IAN: si vous voulez en quelque sorte à accéder à la clé de la valeur, utilisez ceci:

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

Résultat:

message=this is a test message