Doit spécifier un tableau associatif, un tableau numérique ou s'il doit fonctionner sur les deux.
Jimbo Jonny
foire aux questions
Josua Marcel Chrisano
Réponses:
610
Une solution serait d'utiliser une combinaison de endet (citant) :key
end() avance le pointeur interne du tableau sur le dernier élément et renvoie sa valeur.
key() renvoie l'élément d'index de la position actuelle du tableau.
Donc, une partie du code comme celui-ci devrait faire l'affaire:
$array = array('first'=>123,'second'=>456,'last'=>789,);end($array);// move the internal pointer to the end of the array
$key = key($array);// fetches the key of the element pointed to by the internal pointer
var_dump($key);
Sortira:
string'last'(length=4)
c'est-à-dire la clé du dernier élément de mon tableau.
Après cela, le pointeur interne du tableau sera à la fin du tableau. Comme indiqué dans les commentaires, vous souhaiterez peut-être exécuter reset()sur le tableau pour ramener le pointeur au début du tableau.
@Pim: dépend de ce que l'OP veut faire avec ce tableau après (peut ne pas être nécessaire pour appeler reset()) ;; mais vous avez raison de pointer cette fonction, qui pourrait être utile.
Pascal MARTIN du
3
@PascalMARTIN +1 Je pense que l'ajout d'un commentaire sur la réinitialisation () dans votre réponse sera très utile.
Lulu
Cette approche ne fonctionne pas si le tableau a des valeurs en double. par exemple. car array('a', 'b', 'c', 'd', 'a')il renverra la clé 0 plutôt que 4.
Marc
2
@Marc, cette approche fonctionne correctement même s'il existe une valeur en double.
Jeff
1
@pppp ça ne marche pas parce que ... vérifiez ce que retourne end () puis réfléchissez à nouveau;)
forsberg
79
Bien que cela end()semble être le plus simple, ce n'est pas le plus rapide. L'alternative la plus rapide et la plus puissante est array_slice():
excité par cette réponse, j'ai fait un test rapide de 100 000 itérations, en comparant (a) end($arr);$key = key($arr);reset($arr);contre (b) $key = key(array_slice($arr,-1,1,true));... ce qui a pour résultat d' end()être BEAUCOUP plus rapide! end () = 0,05326 secondes, array_slice = 8,506 secondes ... hein ??
neokio
54
Les fonctions intégrées de PHP ont été conçues par des nerds extrêmes. N'essayez pas de recréer ces fonctions. Les chances sont que vous faites quelque chose de beaucoup plus lent que l'original. Sauf si vous êtes une sorte de sorcier maléfique, de couse.
dmmd
16
end()est le plus rapide car il peut être dérivé d'une fonction C très simple, telle que:int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
Gustav
10
@Gustav Je crois que l'implémentation C sous-jacente de PHP, a en fait un pointeur interne lastvers le dernier élément. Faire à end()peu près O (1). :-)
Eric
15
@dmmd, je suis sûr que l'équipe PHP serait extrêmement contente qu'ils s'appellent des nerds.
@BenFortune Cela a été corrigé dans PHP7: "En PHP 5, l'utilisation de parenthèses redondantes autour d'un paramètre de fonction pouvait calmer des avertissements de normes strictes lorsque le paramètre de fonction était transmis par référence. L'avertissement sera désormais toujours émis."
Dominic Scheirlinck
c'est un avertissement totalement inutile! c'est un truc normal et habituel dans toutes les autres langues!
azerafati
1
Dans d'autres langues, les fonctions ne fonctionnent pas sur les pointeurs, n'est-ce pas?
Horray! J'étais sur le point d'ajouter cette réponse. Pourriez-vous mettre en évidence la version "PHP 7.3" et l'année 2018? Il sera plus facile de repérer cette nouvelle géniale pour les autres
Tomáš Votruba
Il est également bon de mentionner que cela n'affecte PAS le pointeur de tableau interne.
Cela ne fonctionne que si vous avez des tableaux numériques. Échoue avec les tableaux associés.
Jeremy J Starcher
12
Non seulement cela ne fonctionne que sur des tableaux numériques, mais il ne montre pas la clé mais affiche la valeur, n'est-ce pas?
Nanne
moi aussi jake, pouvons-nous faire une chose où nous avons divisé ce (soyons honnêtes) top google hit à la fois numérique et associatif afin que nous ayons une ancienne référence pour les deux ... J'ai seulement compris que c'était pour assoc après l'analyse int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }qui est intéressant mais pas bon pour les affaires lorsque vous avez un budget temps
lol
5
De plus, même pour un tableau numérique, gardez à l'esprit que les tableaux numériques ne doivent pas aller dans l'ordre, ou utilisez tous les nombres. Cela fonctionnera si vous n'affectez pas explicitement à des valeurs numériques, mais si vous le faites $a[1] = 1; $a[5] = 5; $a[0] = 0;, vous aurez alors un tableau avec des clés (1, 5, 0), dans cet ordre. count($a)donnera 3 et $a[2]n'est pas défini. Cela ne vous rend certainement pas 5.
Daniel Skarbek
1
Relisez la question "Comment obtenir la dernière clé d'un tableau?"
20
Je ne sais pas si cela va être plus rapide ou non, mais il semble plus facile de le faire de cette façon, et vous évitez l'erreur en ne passant pas de fonction à end () ...
il avait juste besoin d'une variable ... pas un gros problème pour écrire une ligne de code de plus, puis désactivez-la si vous en aviez besoin.
Cette réponse (bien que techniquement correcte) est inutile / inefficace car elle nécessite la création d'un tableau supplémentaire (de longueur égale à l'original). Cela signifie que les déchets augmentent comme la matrice d'origine. Cela ne devrait jamais être préféré à la réponse efficace de Pascal MARTIN. Je suis surpris que cela ait autant de votes positifs.
mickmackusa
12
Depuis PHP7.3, vous pouvez accéder directement à la dernière clé dans (le niveau externe de) un tableau avec array_key_last ()
Le met définitivement une grande partie du débat sur cette page au lit. C'est de loin le meilleur interprète, ne souffre d'aucun effet secondaire et est une technique directe, intuitive et à appel unique pour fournir exactement ce que cette question cherche.
* le tableau de test contient 500000 éléments, microtime répété 100x puis moyenné puis multiplié par 1000 pour éviter la notation scientifique. Nous remercions @MAChitgarha pour la référence initiale commentée sous la réponse de @ TadejMagajna .
Cela signifie que vous pouvez récupérer la valeur de la clé finale sans:
déplacer le pointeur de tableau (qui nécessite deux lignes de code) ou
trier, inverser, éclater, compter, indexer un tableau de clés ou tout autre tromperie
Cette fonction était attendue depuis longtemps et un ajout bienvenu à la ceinture d'outils de la fonction de tableau qui améliore les performances, évite les effets secondaires indésirables et permet un code propre / direct / intuitif.
Les deux fonctions reviennent null si le tableau est vide.
Les fonctions frère array_value_first()et sœur ignorées ( & array_value_last()) auraient également offert au pointeur ignorant l'accès aux éléments de serre-livres, mais elles n'ont manifestement pas réussi à recueillir suffisamment de votes pour prendre vie.
Voici quelques pages pertinentes sur les nouvelles fonctionnalités:
Cette réponse devrait figurer en tête de liste. C'est tout simplement complet.
John
1
Wow, un DV sur CETTE réponse à moi? Quelle était la question, trop complète / définitive / explicative / appuyée? Pfft. Continuez certainement à repousser les messages qui osent informer. Bon travail. Au cas où vous ne le sauriez pas, le bouton DV est destiné aux publications qui ne sont "pas utiles". Veuillez vous demander quel est votre objectif ici.
C'est vraiment lent si votre tableau contient plus d'une chose. Veuillez ne pas faire ça.
Andrey
3
et provoque également un AVIS STRICT, référence variable
Wiliam
array_pop () raccourcirait le tableau d'origine (en supprimant le dernier élément). Je ne sais pas si cela est important ou non pour le PO, mais le sera certainement pour d'autres.
Programmeur
1
Pas vraiment. Dans cet exemple, array_pop()fonctionne sur la valeur de retour de array_keys()et non sur le tableau d'origine.
Petko Bossakov
Parce qu'il existe d'autres réponses plus efficaces qui ne déclenchent pas un AVIS, je vote en aval cette réponse.
mickmackusa
6
Depuis PHP> = 7.3 array_key_last()est le meilleur moyen d'obtenir la dernière clé d'un tableau. En utilisant la combinaison de end(), key()et reset()juste pour obtenir la clé d'un dernier tableau est scandaleux.
Je voudrais également proposer une solution alternative à ce problème.
En supposant que toutes vos clés sont numériques sans aucun espace, ma méthode préférée consiste à compter le tableau puis moins 1 à partir de cette valeur (pour tenir compte du fait que les clés du tableau commencent à 0.
Cela ne fonctionnera pas pour les tableaux où les clés ne sont pas incrémentielles, par exemple tableau (0 => 'chien', 5 => 'chat'); $ lastKey retournerait une mauvaise valeur
kakoma
@kakoma - Comme mon article le dit "En supposant que toutes vos clés sont numériques sans aucun espace".
Étant donné que cette réponse ne concerne qu'une fraction des possibilités de tableau (tableaux à clés numériques consécutifs), cette réponse n'offre pas une réponse robuste / correcte à la question généralisée de l'OP. Downvote.
Inverser le tableau entier uniquement pour extraire une valeur est certainement moins efficace que la méthode de PascalMARTIN. Même s'il est techniquement correct, il ne doit jamais être utilisé à la place de l'approche de Pascal.
mickmackusa
3
J'ai juste pris la fonction d'aide d'Alex et l'ai améliorée avec les réponses avant:
Réponses:
Une solution serait d'utiliser une combinaison de
end
et (citant) :key
end()
avance le pointeur interne du tableau sur le dernier élément et renvoie sa valeur.key()
renvoie l'élément d'index de la position actuelle du tableau.Donc, une partie du code comme celui-ci devrait faire l'affaire:
Sortira:
c'est-à-dire la clé du dernier élément de mon tableau.
Après cela, le pointeur interne du tableau sera à la fin du tableau. Comme indiqué dans les commentaires, vous souhaiterez peut-être exécuter
reset()
sur le tableau pour ramener le pointeur au début du tableau.la source
reset()
) ;; mais vous avez raison de pointer cette fonction, qui pourrait être utile.array('a', 'b', 'c', 'd', 'a')
il renverra la clé 0 plutôt que 4.Bien que cela
end()
semble être le plus simple, ce n'est pas le plus rapide. L'alternative la plus rapide et la plus puissante estarray_slice()
:Comme le disent les tests , sur un tableau de 500 000 éléments, c'est presque 7 fois plus rapide!
la source
end($arr);$key = key($arr);reset($arr);
contre (b)$key = key(array_slice($arr,-1,1,true));
... ce qui a pour résultat d'end()
être BEAUCOUP plus rapide! end () = 0,05326 secondes, array_slice = 8,506 secondes ... hein ??end()
est le plus rapide car il peut être dérivé d'une fonction C très simple, telle que:int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
last
vers le dernier élément. Faire àend()
peu près O (1). :-)je préfère
la source
end((array_keys($myarr)))
pour contourner l'avis.Depuis PHP 7.3 (2018) il y a (enfin) une fonction pour cela: http://php.net/manual/en/function.array-key-last.php
affichera
la source
Utilisez simplement:
echo $array[count($array) - 1];
la source
int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
qui est intéressant mais pas bon pour les affaires lorsque vous avez un budget temps$a[1] = 1; $a[5] = 5; $a[0] = 0;
, vous aurez alors un tableau avec des clés (1, 5, 0), dans cet ordre.count($a)
donnera 3 et$a[2]
n'est pas défini. Cela ne vous rend certainement pas 5.Je ne sais pas si cela va être plus rapide ou non, mais il semble plus facile de le faire de cette façon, et vous évitez l'erreur en ne passant pas de fonction à end () ...
il avait juste besoin d'une variable ... pas un gros problème pour écrire une ligne de code de plus, puis désactivez-la si vous en aviez besoin.
la source
Depuis PHP7.3, vous pouvez accéder directement à la dernière clé dans (le niveau externe de) un tableau avec array_key_last ()
Le met définitivement une grande partie du débat sur cette page au lit. C'est de loin le meilleur interprète, ne souffre d'aucun effet secondaire et est une technique directe, intuitive et à appel unique pour fournir exactement ce que cette question cherche.
Une référence approximative comme preuve: https://3v4l.org/hO1Yf
Cela signifie que vous pouvez récupérer la valeur de la clé finale sans:
Cette fonction était attendue depuis longtemps et un ajout bienvenu à la ceinture d'outils de la fonction de tableau qui améliore les performances, évite les effets secondaires indésirables et permet un code propre / direct / intuitif.
Voici une démo :
Production:
Quelques notes:
array_key_last()
est la fonction sœur de array_key_first () .null
si le tableau est vide.array_value_first()
et sœur ignorées ( &array_value_last()
) auraient également offert au pointeur ignorant l'accès aux éléments de serre-livres, mais elles n'ont manifestement pas réussi à recueillir suffisamment de votes pour prendre vie.Voici quelques pages pertinentes sur les nouvelles fonctionnalités:
ps Si quelqu'un soupèse certaines des autres techniques, vous pouvez vous référer à cette petite collection de comparaisons: ( Démo )
la source
Essayez d'utiliser les fonctions array_pop et array_keys comme suit:
la source
array_pop()
fonctionne sur la valeur de retour dearray_keys()
et non sur le tableau d'origine.Depuis PHP> = 7.3
array_key_last()
est le meilleur moyen d'obtenir la dernière clé d'un tableau. En utilisant la combinaison deend()
,key()
etreset()
juste pour obtenir la clé d'un dernier tableau est scandaleux.comparer cela à
Vous devez réinitialiser le tableau pour que le pointeur soit au début si vous utilisez une combinaison de
end()
etkey()
la source
Je voudrais également proposer une solution alternative à ce problème.
En supposant que toutes vos clés sont numériques sans aucun espace, ma méthode préférée consiste à compter le tableau puis moins 1 à partir de cette valeur (pour tenir compte du fait que les clés du tableau commencent à 0.
Cela vous donnerait:
la source
Vous pouvez utiliser ceci:
Une autre solution consiste à créer une fonction et à l'utiliser:
la source
la source
J'ai juste pris la fonction d'aide d'Alex et l'ai améliorée avec les réponses avant:
la source
Essayez celui-ci avec
array_reverse()
.la source
C'est étrange, mais pourquoi ce sujet n'a pas cette réponse:
$lastKey = array_keys($array)[count($array)-1];
la source
Cela fonctionne parce que PHP déplace son pointeur de tableau en interne pour $ array
la source
La meilleure solution possible qui peut également être utilisée utilisée en ligne:
Cette solution n'est qu'une expression / instruction et fournit de bonnes performances n'est pas la meilleure possible.
Exemple d'utilisation en ligne:
MISE À JOUR: En PHP 7.3+: utilisez (bien sûr) la
array_key_last()
méthode nouvellement ajoutée .la source