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

335

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

ajsie
la source
10
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.

Pascal MARTIN
la source
17
@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():

$lastKey = key(array_slice($array, -1, 1, true));

Comme le disent les tests , sur un tableau de 500 000 éléments, c'est presque 7 fois plus rapide!

Tadej Magajna
la source
98
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.
datasn.io
53

je préfère

end(array_keys($myarr))
Rutger van Baren
la source
19
provoque un AVIS STRICT, la fin attend une référence de variable
Wiliam
25
Vous pouvez utiliser end((array_keys($myarr)))pour contourner l'avis.
Ben Fortune
9
@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?
jurchiks
52

Depuis PHP 7.3 (2018) il y a (enfin) une fonction pour cela: http://php.net/manual/en/function.array-key-last.php

$array = ['apple'=>10,'grape'=>15,'orange'=>20];
echo array_key_last ( $array )

affichera

orange
Patryk Godowski
la source
4
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.
mvorisek
30

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

Aditya Choudhary
la source
75
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.

$array = array(
    'first' => 123,
    'second' => 456,
    'last' => 789, 
);

$keys = array_keys($array);
$last = end($keys);
Ryan Hungate
la source
2
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.

Une référence approximative comme preuve: https://3v4l.org/hO1Yf

array_slice() + key():  1.4
end() + key():         13.7
array_key_last():       0.00015

* 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:

  1. déplacer le pointeur de tableau (qui nécessite deux lignes de code) ou
  2. 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.

Voici une démo :

$array = ["a" => "one", "b" => "two", "c" => "three"];
if (!function_exists('array_key_last')) {
    echo "please upgrade to php7.3";
} else {
    echo "First Key: " , key($array) , "\n";
    echo "Last Key: " , array_key_last($array) , "\n";
    next($array);                 // move array pointer to second element
    echo "Second Key: " , key($array) , "\n";
    echo "Still Last Key: " , array_key_last($array);
}

Production:

First Key: a
Last Key: c     // <-- unaffected by the pointer position, NICE!
Second Key: b
Last Key: c     // <-- unaffected by the pointer position, NICE!

Quelques notes:

  • array_key_last()est la fonction sœur de array_key_first () .
  • Ces deux fonctions sont "ignorantes du pointeur".
  • 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:

ps Si quelqu'un soupèse certaines des autres techniques, vous pouvez vous référer à cette petite collection de comparaisons: ( Démo )

Duration of array_slice() + key():     0.35353660583496
Duration of end() + key():             6.7495584487915
Duration of array_key_last():          0.00025749206542969
Duration of array_keys() + end():      7.6123380661011
Duration of array_reverse() + key():   6.7875385284424
Duration of array_slice() + foreach(): 0.28870105743408
mickmackusa
la source
2
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.
mickmackusa
8

Essayez d'utiliser les fonctions array_pop et array_keys comme suit:

<?php

$array = array(
    'one' => 1,
    'two' => 2,
    'three' => 3
);

echo array_pop(array_keys($array)); // prints three

?>
codaddict
la source
14
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.

$array = array("one" => bird, "two" => "fish", 3 => "elephant");
$key = array_key_last($array);
var_dump($key) //output 3

comparer cela à

end($array)
$key = key($array)
var_dump($key) //output 3
reset($array)

Vous devez réinitialiser le tableau pour que le pointeur soit au début si vous utilisez une combinaison de end()etkey()

Hilary Okoro
la source
4

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.

$array = array(0=>'dog', 1=>'cat');

$lastKey = count($array)-1;
$lastKeyValue = $array[$lastKey];

var_dump($lastKey);
print_r($lastKeyValue);

Cela vous donnerait:

int (1) chat


la source
1
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".
Pour tous ceux qui se demandent, utilisez les "tableaux_valeurs" de PHP pour retaper le tableau en séquentiel numérique. php.net/manual/en/function.array-values.php
1
É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.
mickmackusa
4

Vous pouvez utiliser ceci:

$array = array("one" => "apple", "two" => "orange", "three" => "pear");
end($array); 
echo key($array);

Une autre solution consiste à créer une fonction et à l'utiliser:

function endKey($array){
end($array);
return key($array);
}

$array = array("one" => "apple", "two" => "orange", "three" => "pear");
echo endKey($array);
Atif Tariq
la source
1
Cette réponse ne fournit rien de nouveau qui n'est pas déjà dans ce fil.
Martin
1
Martin, personne n'utilise la fonction pour obtenir le résultat.
Atif Tariq
1
avez-vous besoin d'ajouter 1 ligne de code dans une fonction? C'est une interface plutôt inutile.
Martin
1
Martin, dont une ligne.
Atif Tariq
2
la ligne dans votre fonction
Martin
3
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'value3');
list($last_key) = each(array_reverse($arr));
print $last_key;
// key3
voodoo417
la source
2
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:

function last($array){
  $keys = array_keys($array);
  return end($keys);
}


$arr = array("one" => "apple", "two" => "orange", "three" => "pear");    
echo last($arr);
echo $arr(last($arr));
Steve
la source
1

Essayez celui-ci avec array_reverse().

 $arr = array(
     'first' => 01,
     'second' => 10,
     'third' => 20, 
 );  
 $key = key(array_reverse($arr));
 var_dump($key);
Vishal Kumar
la source
1

C'est étrange, mais pourquoi ce sujet n'a pas cette réponse:

$lastKey = array_keys($array)[count($array)-1];

Alex
la source
0
$array = array(
    'something' => array(1,2,3),
    'somethingelse' => array(1,2,3,4)
);

$last_value = end($array);
$last_key = key($array); // 'somethingelse'

Cela fonctionne parce que PHP déplace son pointeur de tableau en interne pour $ array

Scottymeuk
la source
2
Il s'agit d'un doublon de la méthode de PascalMARTIN. Veuillez épargner cette page et supprimer votre réponse tardive / en double. Voté.
mickmackusa
0

La meilleure solution possible qui peut également être utilisée utilisée en ligne:

end($arr) && false ?: key($arr)

Cette solution n'est qu'une expression / instruction et fournit de bonnes performances n'est pas la meilleure possible.

Exemple d'utilisation en ligne:

$obj->setValue(
    end($arr) && false ?: key($arr) // last $arr key
);


MISE À JOUR: En PHP 7.3+: utilisez (bien sûr) la array_key_last()méthode nouvellement ajoutée .

mvorisek
la source