php foreach ne montre pas la première valeur dans le tableau

J'ai un tableau ($ vEvents) comme suit:

Array
(
[0] => Array
    (
        [id] => 1174
        [date] => 120411
        [name] => DR. J 'Souled Out' ~ 9pm (No Cover)
        [pubId] => 44
        [price] => 
    )

[1] => Array
    (
        [id] => 1108
        [date] => 120410
        [name] => Verb presents Open Stage ~ 9pm (No Cover)
        [pubId] => 44
        [price] => 
    )

[2] => Array
    (
        [id] => 1104
        [date] => 120409
        [name] => DR. J 'Souled Out' ~ 9pm (No Cover)
        [pubId] => 44
        [price] => 
    )
[currLimit] => 10
[eventsRemaining] => 4

Je fais écho à l'écran avec:

reset ($vEvents);
foreach ($vEvents as $key => &$value) {
    if ($key != 'currLimit' && $key != 'eventsRemaining'){ //Makes sure it doesn't print out the limiter value
    $m = substr($value['date'],0,2);
    $d = substr($value['date'],2,2);
    $y = '20'.substr($value['date'],4,2);
    echo date("D", mktime(0, 0, 0, $m, $d, $y)).", ".date("M", mktime(0, 0, 0, $m, $d, $y))." ".$d.", ".$y." - ".$value['name'].'
'; } }

Mais sur ma sortie, au lieu d'obtenir toutes les entrées de tableau affichées, il continue de sauter le premier ... Sortie:

Sat, Dec 04, 2010 - Verb presents Open Stage ~ 9pm (No Cover)
Fri, Dec 04, 2009 - DR. J 'Souled Out' ~ 9pm (No Cover)

Cependant, ma sortie attendue devrait être:

Sun, Dec 04, 2011 - DR. J 'Souled Out' ~ 9pm (No Cover)
Sat, Dec 04, 2010 - Verb presents Open Stage ~ 9pm (No Cover)
Fri, Dec 04, 2009 - DR. J 'Souled Out' ~ 9pm (No Cover)

J'ai essayé de changer les valeurs dans la clé name et ainsi de suite, mais tous les autres montrent bien, il saute toujours la première clé. Je n'ai jamais eu ce problème auparavant. Pensées?

When I comment out the:if ($key != 'currLimit' && $key != 'eventsRemaining'){ //Makes sure it doesn't print out the limiter value line, it works fine. Is it relevant that the key of the first element is zero? But why would that fail my if check?

1
Ne pas dire que c'est définitivement le problème, mais cela vous dérangerait-il de partager pourquoi vous préfixez votre variable de boucle avec l'esperluette?
ajouté l'auteur Brian Warshaw, source
Vos clés numériques sont-elles réellement numériques ou sont-elles des chaînes?
ajouté l'auteur Brian Warshaw, source
Votre code semble bien. Y a-t-il quelque chose qui se passe entre votre print_r() et votre boucle? D'ailleurs, vous pouvez épargner le reset -call car il ne devrait avoir aucun effet.
ajouté l'auteur yankee, source
@yankee J'ai ajouté le reset pour essayer de déboguer le problème. D'habitude je ne l'aurais pas ajouté.
ajouté l'auteur MaurerPower, source
@chris il y a une ligne que j'utilisais dedans, mais je ne vois pas comment cela l'affecterait ... S'il vous plaît voir la question mise à jour
ajouté l'auteur MaurerPower, source
Le contenu du code et du tableau que vous avez posté ne représente pas correctement le code et le contenu du tableau que vous êtes en train d'exécuter. exécutez le code et le tableau que vous avez publiés dans un tout nouveau script totalement séparé, et vous verrez que cela fonctionne.
ajouté l'auteur goat, source
essayez de déboguer la valeur dans la boucle for
ajouté l'auteur Moyed Ansari, source

2 Réponses

Parce que c'est un tableau, j'essaierais d'utiliser un type différent de boucle qui devrait vous donner les résultats attendus:

<?php

$length = count( $vEvents );

for( $i = 0; $i < $length; i ++ )
{

$key = $i;
$value = $vEvents[ $i ];

//rest of the loop code here

}
?>
3
ajouté
@SteveBinder: Cela n'est pas vrai car vous pouvez utiliser foreach pour les tableaux associatifs comme ceci: foreach ($ array comme $ key => $ value)
ajouté l'auteur xbonez, source
foreach est une abstraction non spécifique aux tableaux, mais bien adaptée aux tableaux. Il est parfaitement possible d'utiliser foreach car je le perçois comme un ajout à la lisibilité du code.
ajouté l'auteur yankee, source
ma compréhension est la boucle foreach est spécifiquement utilisé pour itérer à travers un tableau, en commençant par le premier élément, et se terminant à la dernière
ajouté l'auteur MaurerPower, source
le problème est qu'il y a deux clés que j'aurai besoin d'accéder plus tard dans la boucle après que j'aie résolu ce problème. Ils sont associatifs. Ainsi pourquoi j'essaye d'employer un foreach.
ajouté l'auteur MaurerPower, source
foreach est préférable lorsque vous ne connaissez pas les clés/index d'un objet, alors que les boucles for sont meilleures pour les tableaux indexés.
ajouté l'auteur Steve Binder, source
la question ici est cependant pourquoi le foreach ignore l'index "0", c'est pourquoi j'ai recommandé une boucle for.
ajouté l'auteur Steve Binder, source

PHP est bizarre quand il traite des valeurs de 0 ... il les traite comme faux dans la plupart des cas. Alors,

if ($key != 'currLimit' && $key != 'eventsRemaining')

va évaluer à false quand $ key == 0. Je le changerais en:

if ($key !== 'currLimit' && $key !== 'eventsRemaining')
2
ajouté
Parfait!!! Bien que je sache que 0 équivaut à faux en PHP, je n'avais aucune idée que cela entrerait en vigueur avec ce type de syntaxe. L'utilisation de la comparaison stricte a bien fonctionné, merci !!!
ajouté l'auteur MaurerPower, source
Merci encore! C'est pourquoi j'aime tellement. Les utilisateurs comme vous qui fournissent non seulement d'excellentes réponses, mais aussi une explication claire de pourquoi. Voilà comment nous apprenons tous :)
ajouté l'auteur MaurerPower, source
A creusé un peu et découvert que parce que $ key est une valeur entière, PHP convertit 'currLimit' en un entier ... qui évalue à 0. Donc 0! = 0 est faux.
ajouté l'auteur bobwienholt, source