D'accord,
Je sais tout array_pop()
, mais cela supprime le dernier élément. Quelle est la meilleure façon d'obtenir le dernier élément d'un tableau sans le supprimer?
EDIT: Voici un bonus:
$array = array('a' => 'a', 'b' => 'b', 'c' => 'c');
ou même
$array = array('a', 'b', 'c', 'd');
unset($array[2]);
echo $array[sizeof($array) - 1]; // Output: PHP Notice: Undefined offset: 2 in - on line 4
Réponses:
Les nombreuses réponses de ce fil nous présentent de nombreuses options différentes. Pour pouvoir choisir parmi eux, j'avais besoin de comprendre leur comportement et leurs performances. Dans cette réponse , je vais partager mes découvertes avec vous, étalonnées par rapport versions PHP
5.6.38
,7.2.10
et7.3.0RC1
( prévu le 13 décembre 2018 ).Les options que
<<option code>>
je vais tester sont:$x = array_values(array_slice($array, -1))[0];
( comme suggéré par rolacja )$x = array_slice($array, -1)[0];
( comme suggéré par Stoutie )$x = array_pop((array_slice($array, -1)));
( comme suggéré par rolacja )$x = array_pop((array_slice($array, -1, 1)));
( comme suggéré par Westy92 )$x = end($array); reset($array);
( comme suggéré par Iznogood )$x = end((array_values($array)));
( comme suggéré par TecBrat )$x = $array[count($array)-1];
( comme suggéré par Mirko Pagliai )$keys = array_keys($array); $x = $array[$keys[count($keys)-1]];
( comme suggéré par thrau )$x = $array[] = array_pop($array);
( comme suggéré par user2782001 )$x = $array[array_key_last($array)];
( comme suggéré par le clone de Quasimodo ; disponible par PHP 7.3)(fonctions mentionnées: array_key_last , array_keys , array_pop , array_slice , array_values , count , end , reset )
Les entrées de test
<<input code>>
à combiner avec:$array = null;
$array = [];
$array = ["a","b","c",null];
$array = ["a","b","c","d"];
$array = []; $array[1] = "a"; $array[2] = "b"; $array[0] = "c";
$array = []; for($i=0;$i<100;$i++) { $array[] = $i; }
$array = []; for($i=0;$i<100000;$i++) { $array[] = $i; }
Pour tester , je vais utiliser le
5.6.38
,7.2.10
et les7.3.0RC1
conteneurs PHP docker comme:Chaque combinaison des
<<option code>>
s et<<input code>>
s listés ci-dessus sera exécutée sur toutes les versions de PHP. Pour chaque test, l'extrait de code suivant est utilisé:Pour chaque exécution, cela var_dump la dernière dernière valeur récupérée de l'entrée de test et affichera la durée moyenne d'une itération en femtosecondes (0,00000000000000001e de seconde).
Les résultats sont les suivants:
Mentionné ci - dessus F Atal, W vertissement et N VIS codes se traduisent par:
Sur la base de ce résultat, je tire les conclusions suivantes:
$x = end((array_values($array)));
$keys = array_keys($array); $x = $array[$keys[count($keys)-1]];
$x = end($array); reset($array);
$x = $array[count($array)-1];
$x = $array[] = array_pop($array);
$x = $array[array_key_last($array)];
(depuis PHP 7.3)$x = $array[count($array)-1];
(en raison de l'utilisation decount
)$x = $array[] = array_pop($array);
(en raison de l'attribution d'une valeur en perdant la clé d'origine)$x = end($array); reset($array);
$x = end((array_values($array)));
array_key_last
fonction ne semble avoir aucune des limitations mentionnées ci-dessus à l'exception d'être toujours un RC au moment de la rédaction de cet article (alors utilisez le RC ou attendez sa sortie en décembre 2018):$x = $array[array_key_last($array)];
(depuis PHP 7.3)Un peu selon que vous utilisez le tableau comme pile ou comme file d'attente, vous pouvez faire des variations sur l'option 9.
la source
$array[array_key_last($array)];
de votre référence. Et veuillez me donner une notification lorsque vous avez terminé. J'aimerais voir les résultats de performance en comparaison.Essayer
Pour le réinitialiser (merci @hopeseekr):
Lien vers le manuel
@David Murdoch a ajouté:
$myLastElement = end(array_values($yourArray));// and now you don't need to call reset().
sur E_STRICT cela produit l'avertissementMerci o_O Tync et tout le monde!
la source
$myLastElement = end(array_values($yourArray));
et maintenant vous n'avez pas besoin d'appelerreset()
.end(array_values())
donnera un E_STRICT: "Seules les variables doivent être passées par référence"end((array_values($yourArray)))
Court et doux.
J'ai trouvé une solution pour supprimer les messages d'erreur et préserver la forme à une ligne et les performances efficaces:
- solution précédente
Remarque: Les parenthèses supplémentaires sont nécessaires pour éviter a
PHP Strict standards: Only variables should be passed by reference
.la source
$array = array_slice($array, -1); $lastEl = array_pop($array);
Personnellement, je pense que c'est mieux (sans le «bug» de l'analyseur)array_size() > 1
2. Vérifiez si le tableau est réellement un tableau. Je reste fidèle à la réponse de @Iznogood, car la fonction intégrée de PHPend()
fait déjà tout le travail de manière plus efficace.Qu'est-ce qui ne va pas
array_slice($array, -1)
? (Voir le manuel: http://us1.php.net/array_slice )array_slice()
renvoie un tableau. Probablement pas ce que vous cherchez. Vous voulez l'élément.la source
array_slice($array, -1)[0]
pour obtenir l'élément.reset(array_slice($array, -1))
est une autre approche (qui ne provoquera pas d'erreur siarray_slice()
renvoie quelque chose de "plus petit" qu'un tableau à un seul élément)array_slice($array, -1)[0] = "";
Une façon d'éviter les erreurs de passage par référence (par exemple "end (array_values ($ foo))")) consiste à utiliser call_user_func ou call_user_func_array:
la source
end((array_values($yourArray)))
call_user_func
astuce ne fonctionne pas non plus en PHP 7. Je pense que vous êtes coincé avec la création d'une variable temporaire.Si vous ne vous souciez pas de modifier le pointeur interne (prend en charge les tableaux indexés et associatifs):
Si vous voulez une fonction utilitaire qui ne modifie pas le pointeur interne (car le tableau est passé par valeur et la fonction fonctionne sur une copie de celui-ci):
Notez que PHP produit des copies "à la volée", c'est-à-dire uniquement lorsque cela est réellement nécessaire. Le
end()
lui-même modifie le tableau, donc en interne une copie du tableau est générée.Ainsi, l'alternative suivante est en fait plus rapide car en interne, elle ne copie pas le tableau, elle fait juste une tranche:
Ce "foreach / return" est un ajustement pour obtenir efficacement le premier (et ici unique) article.
Enfin, l'alternative la plus rapide mais uniquement pour les tableaux indexés:
Pour mémoire, voici une autre réponse à moi , pour le premier élément du tableau.
la source
array_last
fonction. Pour le premier, vous déclarez que le$array
est copié et pour le second qu'il n'est pas copié. Quelle est la différence / pourquoi est-elle copiée dans la première implémentation et non dans la seconde?non testé: cela ne fonctionnerait-il pas?
Puisque le tableau retourné par array_values est éphémère, personne ne se soucie si son pointeur est réinitialisé.
et si vous avez besoin de la clé pour aller avec, je suppose que vous feriez:
la source
J'en ai besoin assez souvent pour gérer les piles, et je suis toujours déconcerté par le fait qu'il n'y a pas de fonction native qui le fasse sans manipuler le tableau ou son pointeur interne sous une forme ou une autre.
Donc, je porte généralement une fonction util qui est également sûre à utiliser sur des tableaux associatifs.
la source
Pour obtenir le dernier élément d'un tableau, utilisez:
Référence
J'ai répété 1 000 fois, en saisissant le dernier élément des petits et des grands tableaux contenant respectivement 100 et 50 000 éléments.
J'ai utilisé PHP version 5.5.32.
la source
end () fournira le dernier élément d'un tableau
la source
Depuis PHP version 7.3, les fonctions
array_key_first
etarray_key_last
ont été introduites.Étant donné que les tableaux en PHP ne sont pas des types de tableau stricts, c'est-à-dire des collections de taille fixe de champs de taille fixe commençant à l'index 0, mais un tableau associatif étendu dynamiquement, la gestion des positions avec des clés inconnues est difficile et les solutions de contournement ne fonctionnent pas très bien. En revanche, les tableaux réels seraient adressés en interne via l'arithmétique des pointeurs très rapidement et le dernier index est déjà connu au moment de la compilation par déclaration.
Au moins le problème avec la première et la dernière position est résolu par les fonctions intégrées depuis la version 7.3. Cela fonctionne même sans aucun avertissement sur les littéraux de tableau prêts à l'emploi:
Évidemment, la dernière valeur est:
la source
Aucune modification n'est apportée aux pointeurs $ array. Cela évite la
ce qui peut ne pas être souhaité dans certaines conditions.
la source
Pour moi:
Avec les associatifs:
la source
Les meilleures réponses sont excellentes, mais comme mentionné par @ paul-van-leeuwen et @ quasimodos-clone, PHP 7.3 introduira deux nouvelles fonctions pour résoudre directement ce problème - array_key_first () et array_key_last () .
Vous pouvez commencer à utiliser cette syntaxe dès aujourd'hui avec les fonctions polyfill (ou shim) suivantes.
Attention: cela nécessite PHP 5.4 ou supérieur.
la source
Pour ce faire et éviter l'E_STRICT et ne pas jouer avec le pointeur interne du tableau, vous pouvez utiliser:
lelement ne fonctionne qu'avec une copie, cela n'affecte donc pas le pointeur du tableau.
la source
Une autre solution:
la source
Une autre solution possible ...
la source
Que diriez-vous:
$array == []
(retournefalse
)la source
Vous obtiendrez facilement le dernier élément d'un tableau en utilisant la logique ci-dessous
Non seulement le dernier élément, mais vous pouvez également obtenir l'avant-dernier, l'avant-dernier et ainsi de suite en utilisant la logique ci-dessous.
pour l'avant-dernier élément, vous devez passer juste le numéro 2 dans l'instruction ci-dessus, par exemple:
echo ($ array [count ($ array) -2]);
la source
Pour obtenir la dernière valeur de Array:
Pour supprimer le dernier tableau de formulaire de valeur:
la source
array_slice($arr,-1,1)
entraînera un autre tableau de longueur 1, pas le dernier élément$a=array("red","green","blue","yellow","brown"); print_r(array_slice($a,-1,1));
Résultat:Array ( [0] => brown )
Simplement:
$last_element = end((array_values($array)))
Ne réinitialise pas la baie et ne donne pas d'avertissement STRICT.
PS. Étant donné que la réponse la plus votée n'a toujours pas la double parenthèse, j'ai soumis cette réponse.
la source
Je pense que c'est une légère amélioration par rapport à toutes les réponses existantes:
end()
ou solutions utilisantarray_keys()
, en particulier avec des baies de grande taillela source
array_values
sur la tranche à élément unique)Utilisez la fonction end ().
la source
De nos jours, je préférerais toujours avoir cet assistant, comme suggéré dans une réponse php.net/end .
Cela gardera toujours le pointeur tel qu'il est et nous n'aurons jamais à nous soucier des parenthèses, des normes strictes ou quoi que ce soit.
la source
Remarque: Pour (PHP 7> = 7.3.0), nous pouvons utiliser array_key_last - Obtient la dernière clé d'un tableau
Réf: http://php.net/manual/en/function.array-key-last.php
la source
Et si vous voulez obtenir le dernier élément du tableau à l'intérieur de la boucle de son tableau?
Le code ci-dessous se traduira par une boucle infinie:
La solution est évidemment simple pour les tableaux non associatifs:
la source
la source
Depuis PHP 7.3,
array_key_last
est disponiblela source
Très simple
la source
$a = array(); $a[2] = 'c'; $a[1] = 'b'; echo end($a);
reviendrab
ma solution simple, jolie et facile à comprendre.
la source