352 votes

Comment obtenir la dernière clé dans un tableau ?

Comment puis-je obtenir la dernière clé d'un tableau ?

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

635voto

Pascal MARTIN Points 195780

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.

19 votes

@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.

3 votes

@PascalMARTIN +1 Je pense que l'ajout d'un commentaire sur la reset() dans votre réponse sera très utile.

0 votes

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.

88voto

tadoman Points 570

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 !

101 votes

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 ??

56 votes

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.

16 votes

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]; }

53voto

Webjin Points 633

Je préfère

end(array_keys($myarr))

20 votes

Provoque un AVIS STRICT, la fin attend une référence de variable

26 votes

Vous pouvez utiliser end((array_keys($myarr))) pour contourner l'avis.

9 votes

@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."

30voto

Aditya Choudhary Points 159

Utilisez simplement : echo $array[count($array) - 1];

77 votes

Cela ne fonctionne que si vous avez des tableaux numériques. Échec avec les tableaux d'associés.

14 votes

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 ?

0 votes

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.

21voto

Ryan Hungate Points 109

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);

3 votes

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.com

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.

Powered by:

X