J'écris un créateur de requête SQL en utilisant certains paramètres. En Java, il est très facile de détecter le dernier élément d'un tableau de l'intérieur de la boucle for en vérifiant simplement la position actuelle du tableau avec la longueur du tableau.
for(int i=0; i< arr.length;i++){
boolean isLastElem = i== (arr.length -1) ? true : false;
}
En PHP, ils ont des index non entiers pour accéder aux tableaux. Vous devez donc parcourir un tableau à l'aide d'une boucle foreach. Cela devient problématique lorsque vous devez prendre une décision (dans mon cas, ajouter ou / et paramètre lors de la construction de la requête).
Je suis sûr qu'il doit y avoir un moyen standard de procéder.
Comment résolvez-vous cela en PHP?
Réponses:
Il semble que vous souhaitiez quelque chose comme ceci:
Cela étant dit, vous n'avez pas besoin d'itérer sur un "tableau" en utilisant
foreach
php.la source
$numItems = count($arr)
l'astuce n'est pas nécessaire et réduit la lisibilité - en PHP, il n'y a pas de pénalité de performance pour accéder à count ($ arr) à chaque fois. La raison en est que le nombre d'éléments est enregistré en interne en tant que champ spécial dans l'en-tête du tableau et n'est pas calculé à la volée. Cette astuce provient d'autres langages (C, Java?, ...).Vous pouvez obtenir la valeur de la dernière clé du tableau à l'aide
end(array_keys($array))
et la comparer à la clé actuelle:la source
$lastKey = array_search(end($array), $array);
pourquoi si compliqué?
Cela ajoutera un, derrière chaque valeur sauf la dernière!
la source
Lorsque toEnd atteint 0, cela signifie qu'il est à la dernière itération de la boucle.
La dernière valeur est toujours disponible après la boucle, donc si vous voulez juste l'utiliser pour plus de choses après la boucle, c'est mieux:
Si vous ne souhaitez pas traiter la dernière valeur comme des boucles internes spéciales. Cela devrait être plus rapide si vous avez de grands tableaux. (Si vous réutilisez le tableau après la boucle à l'intérieur de la même portée, vous devez d'abord "copier" le tableau).
Et pour répondre à votre question d'origine "dans mon cas, ajouter ou / et paramètre lors de la construction de la requête"; cela bouclera sur toutes les valeurs, puis les joindra ensemble à une chaîne avec "et" entre elles mais pas avant la première valeur ou après la dernière valeur:
la source
$lastValue = array_pop($array);
Je vous remercie.Il existe déjà de nombreuses réponses, mais cela vaut également la peine d'examiner les itérateurs, d'autant plus qu'il a été demandé de manière standard:
Vous pourriez également trouver quelque chose qui fonctionne plus flexible pour d'autres cas.
la source
i=0;
et++i;
ont toujours semblé hackish dans un langage de script comme PHP.Une façon pourrait être de détecter si l'itérateur l'a fait
next
. S'il n'y a pas de prochain attaché à l'itérateur, cela signifie que vous êtes dans la dernière boucle.la source
Donc, si votre tableau a des valeurs de tableau uniques, déterminer la dernière itération est trivial:
Comme vous le voyez, cela fonctionne si le dernier élément n'apparaît qu'une seule fois dans le tableau, sinon vous obtenez une fausse alarme. Dans ce cas, vous devez comparer les clés (qui sont uniques à coup sûr).
Notez également l'opérateur de coparision strict, ce qui est assez important dans ce cas.
la source
En supposant que le tableau soit stocké dans une variable ...
la source
pour obtenir le premier et le dernier élément du tableau foreach
la source
Vous pouvez toujours utiliser cette méthode avec des tableaux associatifs:
la source
Si vous devez faire quelque chose pour chaque élément sauf le premier ou le dernier et seulement s'il y a plus d'un élément dans le tableau, je préfère la solution suivante.
Je sais qu'il existe de nombreuses solutions ci-dessus et publiées des mois / un an avant le mien, mais c'est quelque chose que je trouve assez élégant en soi. La vérification de chaque boucle est également une vérification booléenne par opposition à une vérification numérique "i = (count-1)", qui peut permettre de réduire les frais généraux.
La structure de la boucle peut sembler gênante, mais vous pouvez la comparer à l'ordre de la tête (début), tfoot (fin), tbody (actuel) dans les balises de table HTML.
Par exemple, en termes de développement Web, si vous souhaitez ajouter une bordure inférieure à chaque élément à l'exception du dernier d'une liste non ordonnée (ul), vous pouvez plutôt ajouter une bordure supérieure à chaque élément sauf le premier (le CSS: premier enfant, pris en charge par IE7 + et Firefox / Webkit prend en charge cette logique, alors que: dernier enfant n'est pas pris en charge par IE7).
Vous pouvez vous sentir libre de réutiliser la variable $ first pour chaque boucle imbriquée également et les choses fonctionneront très bien puisque chaque boucle rend $ first faux pendant le premier processus de la première itération (donc les ruptures / exceptions ne causeront pas de problèmes) .
Exemple de sortie:
la source
Cela devrait être le moyen facile de trouver le dernier élément:
Référence: Lien
la source
J'ai le fort sentiment qu'à l'origine de ce "problème XY", l'OP voulait juste
implode()
fonctionner.la source
Comme votre intention de trouver le réseau EOF est juste pour la colle. Découvrez la tactique ci-dessous. Vous n'avez pas besoin de l'EOF:
o / p:
la source
Que diriez-vous d'utiliser "end"? http://php.net/manual/en/function.end.php
la source
Il semble que vous souhaitiez quelque chose comme ceci:
la source
N'ajoutez pas de virgule après la dernière valeur:
Le tableau:
La fonction:
Le résultat:
Lorem ipsum dolor sit amet
la source
vous pouvez faire un compte ().
ou si vous recherchez UNIQUEMENT le dernier élément, vous pouvez utiliser end ().
renvoie uniquement le dernier élément.
et, en fin de compte, vous POUVEZ indexer les tableaux php par des entiers. Il est parfaitement satisfait de
la source
$a = array(0=>'A', 2=>'B', 'aaa'=>'C')
. Qu'obtenez-vous si vous y accédez$a[count($a)-1]
?Vous pouvez également faire quelque chose comme ceci:
la source
J'aime un peu ce qui suit car je pense que c'est assez soigné. Supposons que nous créons une chaîne avec des séparateurs entre tous les éléments: par exemple a, b, c
la source
Référence
la source
Voici une autre façon de procéder:
la source
Si je vous comprends, alors tout ce dont vous avez besoin est d'inverser le tableau et d'obtenir le dernier élément par une commande pop:
la source
Vous pouvez également essayer ceci pour faire votre requête ... affichée ici avec INSERT
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 manière correcte (rapide) de le faire 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
la source
Une autre façon de procéder consiste à se souvenir du résultat du cycle de boucle précédent et à l'utiliser comme résultat final:
la source
J'utilise personnellement ce type de construction qui permet une utilisation facile avec les éléments html <ul> et <li>: changez simplement l'égalité pour une autre propriété ...
Le tableau ne peut pas contenir de faux éléments mais tous les autres éléments qui sont convertis en faux booléen.
la source
Vous pouvez directement obtenir le dernier index en:
$numItems = count($arr);
echo $arr[$numItems-1];
la source
la source
Voici ma solution: obtenez simplement le nombre de votre tableau, moins 1 (car ils commencent en 0).
la source