Comment puis-je obtenir la dernière clé d'un tableau ?
@Pim : dépend de ce que le PO veut faire avec ce tableau après (peut ne pas être nécessaire pour appeler reset()
) ; mais vous avez raison d'indiquer cette fonction, qui pourrait être utile.
Comment puis-je obtenir la dernière clé d'un tableau ?
Une solution serait d'utiliser une combinaison de end
y key
(citation) :
end()
avance le pointeur interne du tableau jusqu'au dernier élément, et retourne sa valeur.key()
renvoie l'élément d'index de la position actuelle du tableau.Ainsi, une portion de code telle que celle-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);
Rendement :
string 'last' (length=4)
c'est-à-dire la clé du dernier élément de mon tableau.
Après cette opération, le pointeur interne du tableau se trouve à la fin du tableau. Comme indiqué dans les commentaires, il est possible de lancer la commande reset()
sur le tableau pour ramener le pointeur au début du tableau.
@Pim : dépend de ce que le PO veut faire avec ce tableau après (peut ne pas être nécessaire pour appeler reset()
) ; mais vous avez raison d'indiquer cette fonction, qui pourrait être utile.
@PascalMARTIN +1 Je pense que l'ajout d'un commentaire sur la reset() dans votre réponse sera très utile.
Cette approche ne fonctionne pas si le tableau contient des valeurs en double, par exemple pour array('a', 'b', 'c', 'd', 'a')
il retournera la touche 0 plutôt que 4.
Bien que end()
semble être le plus facile, ce n'est pas le plus rapide. L'alternative la plus rapide, et la plus puissante, est array_slice()
:
$lastKey = key(array_slice($array, -1, 1, true));
Comme le disent les tests Sur un tableau de 500 000 éléments, il est presque 7 fois plus rapide !
Enthousiasmé 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 entraîne end()
étant BEAUCOUP plus rapide ! end() = 0.05326 secondes, array_slice = 8.506 secondes ... huh ??
Les fonctions intégrées de PHP ont été construites par des nerds de l'extrême. N'essayez pas de recréer ces fonctions. Il y a de fortes chances que vous fassiez quelque chose de beaucoup plus lent que l'original. A moins que vous ne soyez une sorte de magicien maléfique, bien sûr.
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]; }
@BenFortune Cela a été corrigé en PHP7 : "En PHP 5, l'utilisation de parenthèses redondantes autour d'un paramètre de fonction pouvait entraîner des avertissements de normes strictes lorsque le paramètre de fonction était passé par référence. Désormais, l'avertissement sera toujours émis."
Cela ne fonctionne que si vous avez des tableaux numériques. Échec avec les tableaux d'associés.
Non seulement cela ne fonctionne que sur les tableaux numériques, mais cela n'affiche pas la clé mais la valeur, n'est-ce pas ?
Moi aussi jake, on peut faire un truc où on divise ce (soyons honnêtes) top google hit en numérique et associatif pour qu'on ait une vieille référence pour les deux.... Je n'ai compris que c'était pour l'association qu'après l'analyse. int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
ce qui est intéressant mais pas bon pour les affaires quand on a un budget temps.
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 dans une fonction à end()....
il avait juste besoin d'une variable... ce n'était pas un gros problème d'écrire une ligne de code de plus, puis de la désactiver si nécessaire.
$array = array(
'first' => 123,
'second' => 456,
'last' => 789,
);
$keys = array_keys($array);
$last = end($keys);
Cette réponse (bien que techniquement correcte) est un gaspillage/inefficacité car elle nécessite la création d'un tableau supplémentaire (de même longueur que l'original). Cela signifie que le gaspillage augmente avec la longueur du tableau original. Cette réponse ne devrait jamais être préférée à la réponse efficace de Pascal MARTIN. Je suis surpris que cette réponse ait autant de votes positifs.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
12 votes
Doit spécifier un tableau associatif, un tableau numérique, ou si cela doit fonctionner sur les deux.
0 votes
Question fréquemment posée