La question est simple. J'ai une foreach
boucle dans mon code:
foreach($array as $element) {
//code
}
Dans cette boucle, je veux réagir différemment lorsque nous sommes dans la première ou la dernière itération.
Comment faire ça?
Vous pouvez utiliser un compteur:
$i = 0;
$len = count($array);
foreach ($array as $item) {
if ($i == 0) {
// first
} else if ($i == $len - 1) {
// last
}
// …
$i++;
}
array_shift
etarray_pop
. Bien que ce soit la solution que j'aurais trouvée si je devais mettre en œuvre une telle chose, je m'en tiendrai à la réponse de Rok Kralj maintenant.$i = 1
, vous n'avez pas à vous en soucier$len - 1
, utilisez simplement$len
.Si vous préférez une solution qui ne nécessite pas l'initialisation du compteur en dehors de la boucle, je vous propose de comparer la clé d'itération actuelle à la fonction qui vous indique la dernière / première clé du tableau.
Cela devient un peu plus efficace (et plus lisible) avec le prochain PHP 7.3.
Solution pour PHP 7.3 et supérieur:
Solution pour toutes les versions PHP:
la source
end()
+key()
à chaque itération de la boucle - si c'est les deux, c'est que 4 méthodes sont appelées à chaque fois. Certes, ce seraient des opérations très légères et ne sont probablement que des recherches de pointeur, mais les documents continuent de le spécifierreset()
et deend()
modifier le pointeur interne du tableau - est-ce donc plus rapide qu'un compteur? peut-être pas.reset()
appel avant le foreach et à mettre le résultat en cache$first
.Pour trouver le dernier élément, je trouve que ce morceau de code fonctionne à chaque fois:
la source
next
: Avertissement Cette fonction peut renvoyer une valeur booléenneFALSE
, mais peut également renvoyer une valeur non booléenne qui est évaluée commeFALSE
. Veuillez lire la section sur les booléens pour plus d'informations. Utilisez l'===
opérateur pour tester la valeur de retour de cette fonction.[true,true,false,true]
. Mais personnellement, je l'utiliserai chaque fois que je traiterai avec un tableau qui ne contient pas de booléenfalse
.next()
ne doit JAMAIS être utilisé dans une boucle foreach. Il gâche le pointeur de tableau interne. Consultez la documentation pour plus d'informations.Une version plus simplifiée de ce qui précède et en supposant que vous n'utilisez pas d'index personnalisés ...
Version 2 - Parce que j'en suis venu à détester utiliser le else sauf si nécessaire.
la source
if ($index == count($array) - 1)
. Voyez ici .Vous pouvez supprimer les premier et dernier éléments du tableau et les traiter séparément.
Comme ça:
La suppression de toute la mise en forme en CSS au lieu des balises en ligne améliorerait votre code et accélérerait le temps de chargement.
Vous pouvez également éviter de mélanger le HTML avec la logique php autant que possible.
Votre page pourrait être rendue beaucoup plus lisible et maintenable en séparant des choses comme ceci:
la source
Une tentative pour trouver le premier serait:
la source
Cela fonctionne simplement!
Merci @billynoah pour avoir trié le problème final .
la source
if ($key === $lastkey)
.if ($lastkey === $key)
?PHP Warning: key() expects parameter 1 to be array, integer given in php shell code on line 1
key()
obtient un entier, nonend()
.end()
" renvoie la valeur du dernier élément " etkey()
attend un tableau en entrée.1: Pourquoi ne pas utiliser une simple
for
déclaration? En supposant que vous utilisez un vrai tableau et non un tableau,Iterator
vous pouvez facilement vérifier si la variable de compteur est 0 ou un de moins que le nombre entier d'éléments. À mon avis, c'est la solution la plus propre et la plus compréhensible ...2: Vous devriez envisager d'utiliser des ensembles imbriqués pour stocker votre structure arborescente. De plus, vous pouvez améliorer le tout en utilisant des fonctions récursives.
la source
for
vous pouvez faire une boucle à partir1
den-1
et prendre laif
s hors du corps. Inutile de les vérifier à plusieurs reprises.Meilleure réponse:
la source
La réponse la plus efficace de @morg, contrairement à
foreach
, ne fonctionne que pour les tableaux appropriés, pas les objets de carte de hachage. Cette réponse évite la surcharge d'une instruction conditionnelle pour chaque itération de la boucle, comme dans la plupart de ces réponses (y compris la réponse acceptée) en traitant spécifiquement le premier et le dernier élément, et en bouclant sur les éléments du milieu.La
array_keys
fonction peut être utilisée pour faire fonctionner la réponse efficace commeforeach
:Je n'ai pas fait de benchmarking à ce sujet, mais aucune logique n'a été ajoutée à la boucle, ce qui est le plus grand coup à la performance, alors je soupçonne que les benchmarks fournis avec la réponse efficace sont assez proches.
Si vous vouliez fonctionnaliser ce genre de chose, j'ai essayé une telle fonction iterateList ici . Cependant, vous voudrez peut-être comparer le code gist si vous êtes très préoccupé par l'efficacité. Je ne sais pas combien de frais généraux toute l'invocation de fonction introduit.
la source
Pour les scripts générant des requêtes SQL, ou tout ce qui fait une action différente pour le premier ou le dernier élément, il est beaucoup plus rapide (presque deux fois plus rapide) d'éviter d'utiliser des vérifications de variables inutiles.
La solution actuellement acceptée utilise une boucle et une vérification dans la boucle qui sera effectuée à chaque_single_iteration, la bonne (rapide) façon de procéder est la suivante:
Un petit repère fait maison a montré ce qui suit:
test1: 100000 exécutions de modèle morg
temps: 1869.3430423737 millisecondes
test2: 100000 exécutions du modèle si dernier
temps: 3235.6359958649 millisecondes
Et il est donc tout à fait clair que le chèque coûte cher, et bien sûr, il devient encore pire avec les chèques plus variables que vous ajoutez;)
la source
$arr = array('one' => "1 1 1", 4 => 'Four', 1 => 'One'); $numItems = count($arr); $i=0; $firstitem=$arr[0]; echo $i . ': ' . $firstitem . ", "; $i++; while($i<$numItems-1){ $some_item=$arr[$i]; echo $i . ': ' . $some_item . ", "; $i++; } $last_item=$arr[$i]; echo $i . ': ' . $last_item . ", "; $i++;
affichera:0: , 1: One, 2: ,
array()
fait est{'one':"1 1 1",0:"",1:"One",2:"",3:"",4:"Four"}
mais les éléments vides sont ignorés avec count, vous comptez le nombre de "choses" définies !! SACRIFICE BOUNTY ENTRANT! Cette réponse mérite des primes, mais si @Morg. disparu, c'est inutile. Je donnerais une prime à une personne qui n'utilisera probablement plus SO! S'il revient et améliore sa réponse, il mérite la prime!array_keys
fonction, que vous pouvez traiter comme un tableau. Voir ma réponse "améliorée" .$querySet = ""; foreach ($fieldSet as $key=>$value) { $value = $db->dbLink->quote($value); $querySet .= "$key = $value, "; } $querySet = substr_replace($querySet, "", -2); $queryString = "UPDATE users SET $querySet WHERE user_ID = '$user_ID'";
Avec les clés et les valeurs, cela fonctionne également:
la source
L'utilisation d'une variable booléenne est toujours la plus fiable, même si vous voulez vérifier la première apparition d'un
$value
(je l'ai trouvé plus utile dans ma situation et dans de nombreuses situations) , comme ceci:Alors que diriez-vous
!next( $array )
de trouver le dernier$value
qui reviendratrue
s'il n'y a pas denext()
valeur à itérer.Et je préfère utiliser une
for
boucle plutôt queforeach
si j'allais utiliser un compteur, comme ceci:la source
Je suis tombé sur ce fil quand j'ai le même problème. Je n'ai besoin que du premier élément, puis je ré-analyse mon code jusqu'à ce que cela me vienne à l'esprit.
Les codes ci-dessus sont excellents et complets, mais si vous n'avez besoin que du premier élément, vous pouvez essayer ce code.
la source
Je ne sais pas si c'est encore nécessaire. Mais la solution suivante devrait fonctionner avec des itérateurs et ne nécessite pas
count
.la source
Vous pouvez également utiliser une fonction anonyme:
Trois autres choses doivent être mentionnées:
array_values
.$element
vous devez le passer par reference (&$element
).$indexOfLastElement
intérieur de lause
construction, à nouveau par référence si nécessaire.la source
Vous pouvez utiliser le compteur et la longueur du tableau.
la source
la source
Utilisation de reset ($ array) et end ($ array)
Demo repl.it
la source
Essaye ça:
la source