Début de boucle foreach sur tableau associatif au deuxième élément
J'ai un tableau associatif comme:
$myArray = array(
'key1' => 'val 1',
'key2' => 'val 2'
...
);
Je ne connais pas les valeurs de la clé à l'avant, mais souhaitez démarrer en boucle à partir du deuxième élément. Dans l'exemple ci-dessus, ce serait de cle2 partir.
J'ai essayé
foreach(next(myArray) as $el) {
}
mais qui n'a pas fonctionné.
Solutions de rechange peuvent être array_slice
mais qui semble en désordre. Ai-je raté quelque chose d'évident?
OriginalL'auteur Marty Wallace | 2013-09-08
Vous devez vous connecter pour publier un commentaire.
Il n'y a vraiment pas de "une façon de true" de le faire. Donc je vais le prendre comme un point de référence quant à l'endroit où vous devez aller.
Toutes les informations sont basées sur ce tableau.
La array_slice() option. Vous avez dit que vous pensiez que cette option a été exagéré, mais il me semble être la plus courte sur le code.
Faire ce 1000 fois prend
0.015888
secondes.Il y a le tableau des fonctions qui gèrent le pointeur, comme ...
current()
- Retour de l'élément courant dans un tableau.end()
- Définir le pointeur interne d'un tableau de son dernier élément.prev()
Rembobinage interne pointeur sur le tableau.reset()
- Définir le pointeur interne d'un tableau de son premier élément.()
- Retour de la clé actuelle et la valeur de la paire à partir d'un tableau et de faire progresser le tableau curseur.Veuillez noter que le
each()
fonction est obsolète depuis PHP 7.2, et sera supprimée dans PHP 8.Ces fonctions vous donner la solution la plus rapide possible, plus de 1000 itérations.
Faisant cela, 1000 fois, prend
0.014807
secondes.Définir une variable option.
Faire ce 1000 fois prend
0.01635
secondes.J'ai rejeté la array_shift options, car il modifie votre tableau et vous n'avez jamais dit que c'était acceptable.
OriginalL'auteur Mark Tomlin
Cela dépend si vous voulez le faire juste une fois ou plusieurs fois, et si vous avez encore besoin de l'original de tableau plus tard.
"Premier" modèle
Personnellement, j'utilise cette solution assez souvent parce que c'est vraiment simple, tout le monde se présente. Aussi, il n'y a pas de gain de performance de la création d'un nouveau tableau et vous pouvez toujours fonctionner sur le tableau d'origine après la boucle.
Toutefois, si vous avez un couple de boucles comme ça, ça commence à regarder un peu sale, car vous avez besoin de 5 lignes de code supplémentaires par boucle.
array_shift
array_shift
est une fonction adaptée à ce cas particulier de ne pas vouloir le premier élément. Essentiellement, c'est un Perl-ish façon de dire$array = array_slice($array, 1)
qui pourrait ne pas être tout à fait évident, surtout depuis qu'il modifie le tableau d'origine.Donc, vous voudrez peut-être faire une copie du tableau original et la réorienter, si vous avez besoin de la nouvelle matrice à plusieurs reprises et également le tableau d'origine plus tard.
array_slice
Et, bien sûr, il y a
array_slice
lui-même. Je ne vois rien de mal avecarray_slice
si vous souhaitez que le tableau d'origine reste inchangé et vous avez besoin de tranches de tableau à plusieurs reprises. Toutefois, si vous êtes positif que vous en voulez toujours à la tranche juste un élément off, vous pourriez aussi bien utiliser le raccourciarray_shift
(et en faire une copie avant si nécessaire).OriginalL'auteur tmh
Vous pouvez aller avec le moyen le plus évident:
vous avez raison, mais comme c'est un boolean je suis sûr que vous ne verrez jamais de perte de performance
OriginalL'auteur letiagoalves
Juste une autre façon de flexible itération:
Autant que je sache
foreach
est juste une sorte de raccourci pour cette construction.De Zend PHP 5 Certication guide d'étude:
<?php $array = array( 'First', 'Second', 'Third', 'Forth', 'Fifth' ); reset($array); while (next($array) !== FALSE) { echo current($array) . PHP_EOL; } ?>
c'est encore mieux!
OriginalL'auteur zavg
Si votre tableau est 0 basée, il serait
if($key>=1)
, mais que votre tableau commence à clé 1, alors cela devrait fonctionner.$offset
éléments. En règle générale, il est toujours préférable d'utiliser une fonction intégrée qu'elle ne l'est le programme de votre chemin autour de lui.OriginalL'auteur Stuart
Vous pourriez essayer:
Je ne suis pas en désaccord, mais cela dépend de la raison pour sauter le premier élément est. Il y a un certain nombre de façons de réaliser ce que l'OP a demandé - c'est une option qui pourraient être appropriées pour des raisons qu'il n'a pas disparu.
OriginalL'auteur
OriginalL'auteur Tufan Barış Yıldırım
Ma solution plutôt simple lorsque ce problème apparaît. Il a le bel avantage d'être facilement modifiées pour être en mesure d'ignorer plus que le premier élément si vous le souhaitez.
OriginalL'auteur liljoshu