Wie erhalte ich den letzten Schlüssel in einem Array?

335

Wie kann ich den letzten Schlüssel eines Arrays erhalten?

Ajsie
quelle
10
Sollte assoziatives Array, numerisches Array angeben oder wenn auf beiden arbeiten muss.
Jimbo Jonny
häufig gestellte Frage
Josua Marcel Chrisano

Antworten:

610

Eine Lösung wäre, eine Kombination aus endund (unter Angabe) zu verwenden :key

  • end() rückt den internen Zeiger des Arrays auf das letzte Element vor und gibt seinen Wert zurück.
  • key() Gibt das Indexelement der aktuellen Array-Position zurück.

Ein Teil des Codes wie dieser sollte also den Trick machen:

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

Wird ausgegeben:

string 'last' (length=4)

dh der Schlüssel des letzten Elements meines Arrays.

Danach befindet sich der interne Zeiger des Arrays am Ende des Arrays. Wie in den Kommentaren erwähnt, möchten Sie möglicherweise reset()das Array ausführen , um den Zeiger wieder an den Anfang des Arrays zu bringen.

Pascal MARTIN
quelle
17
@Pim: hängt davon ab, was das OP nachher mit diesem Array machen möchte (wird möglicherweise nicht zum Aufrufen benötigt reset()) ;; Aber Sie haben Recht, wenn Sie auf diese Funktion hinweisen, die nützlich sein könnte.
Pascal MARTIN
3
@PascalMARTIN +1 Ich denke, das Hinzufügen eines Kommentars zum reset () in Ihrer Antwort ist sehr hilfreich.
Lulu
Dieser Ansatz funktioniert nicht, wenn das Array doppelte Werte aufweist. z.B. denn array('a', 'b', 'c', 'd', 'a')es wird Schlüssel 0 statt 4 zurückgeben.
Marc
2
@Marc Dieser Ansatz funktioniert auch dann korrekt, wenn doppelte Werte vorhanden sind.
Jeff
1
@pppp es funktioniert nicht, weil ... überprüfen, welches Ende () zurückgibt und dann noch einmal
überlegen
79

Obwohl end()es am einfachsten zu sein scheint, ist es nicht das schnellste. Die schnellere und viel stärkere Alternative ist array_slice():

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

Wie die Tests sagen , ist es auf einem Array mit 500000 Elementen fast 7x schneller!

Tadej Magajna
quelle
98
Von dieser Antwort begeistert, habe ich einen Schnelltest mit 100.000 Iterationen durchgeführt und (a) end($arr);$key = key($arr);reset($arr);mit (b) verglichen $key = key(array_slice($arr,-1,1,true));... was dazu führte, dass end()ich VIEL schneller war! end () = 0.05326 Sekunden, array_slice = 8.506 Sekunden ... huh ??
Neokio
54
Die in PHP integrierten Funktionen wurden von extremen Nerds entwickelt. Versuchen Sie nicht, diese Funktionen neu zu erstellen. Die Chancen stehen gut, dass Sie etwas viel langsamer als das Original machen. Es sei denn, Sie sind eine Art böser Zauberer.
dmmd
16
end()ist am schnellsten, weil es von einer sehr einfachen C-Funktion abgeleitet werden kann, wie:int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
Gustav
10
@Gustav Ich glaube, die zugrunde liegende C-Implementierung von PHP hat tatsächlich einen internen Zeiger lastauf das letzte Element. So end()ziemlich O machen (1). :-)
Eric
15
@dmmd, ich bin sicher, das PHP-Team würde sich sehr darüber freuen, dass sie Nerds genannt werden.
datasn.io
53

ich bevorzuge

end(array_keys($myarr))
Rutger van Baren
quelle
19
verursacht STRICT NOTICE, Ende erwartet eine variable Referenz
Wiliam
25
Sie können verwenden end((array_keys($myarr))), um den Hinweis zu umgehen.
Ben Fortune
9
@BenFortune Dies wurde in PHP7 behoben: "In PHP 5 konnte die Verwendung redundanter Klammern um einen Funktionsparameter strenge Standardwarnungen löschen, wenn der Funktionsparameter als Referenz übergeben wurde. Die Warnung wird jetzt immer ausgegeben."
Dominic Scheirlinck
Das ist eine völlig unnötige Warnung! Es ist so ein normales und übliches Zeug in allen anderen Sprachen!
Azerafati
1
In anderen Sprachen arbeiten die Funktionen nicht mit Zeigern, oder?
Jurchiks
52

Seit PHP 7.3 (2018) gibt es dafür (endlich) eine Funktion: http://php.net/manual/en/function.array-key-last.php

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

wird ausgegeben

orange
Patryk Godowski
quelle
4
Horray! Ich wollte diese Antwort hinzufügen. Könnten Sie die "PHP 7.3" -Version und das Jahr 2018 hervorheben? Es wird einfacher sein, diese großartigen Neuigkeiten für andere zu erkennen
Tomáš Votruba
Gut zu erwähnen, dass dies den internen Array-Zeiger NICHT beeinflusst.
Mvorisek
30

Benutz einfach : echo $array[count($array) - 1];

Aditya Choudhary
quelle
75
Dies funktioniert nur, wenn Sie numerische Arrays haben. Schlägt mit zugeordneten Arrays fehl.
Jeremy J Starcher
12
Dies funktioniert nicht nur nur bei numerischen Arrays, es zeigt auch nicht den Schlüssel, sondern auch den Wert, nicht wahr?
Nanne
Ich auch jake, können wir etwas tun, bei dem wir diesen (um ehrlich zu sein) Top-Google-Hit in numerische und assoziative aufteilen, so dass wir eine alte Referenz für beide haben ... Ich habe nur herausgefunden, dass es für Assoc nach dem Parsen war, int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }was ist interessant, aber nicht gut fürs Geschäft, wenn Sie ein Zeitbudget haben
lol
5
Beachten Sie auch bei einem numerischen Array, dass numerische Arrays nicht in der richtigen Reihenfolge angeordnet sein müssen oder alle Zahlen verwenden müssen. Dies funktioniert, wenn Sie numerischen Werten nicht explizit zuweisen, aber wenn Sie dies tun $a[1] = 1; $a[5] = 5; $a[0] = 0;, haben Sie ein Array mit Schlüsseln (1, 5, 0) in dieser Reihenfolge. count($a)ergibt 3 und $a[2]ist nicht definiert. Es gibt Ihnen sicherlich nicht 5 zurück.
Daniel Skarbek
1
Lesen Sie die Frage noch einmal "Wie erhalte ich den letzten Schlüssel in einem Array?"
20

Sie wissen nicht, ob dies schneller sein wird oder nicht, aber es scheint einfacher zu sein, dies zu tun, und Sie vermeiden den Fehler, indem Sie keine Funktion an end () übergeben ...

Es brauchte nur eine Variable ... keine große Sache, um eine weitere Codezeile zu schreiben und sie dann zu deaktivieren, wenn es nötig war.

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

$keys = array_keys($array);
$last = end($keys);
Ryan Hungate
quelle
2
Diese Antwort ist (obwohl technisch korrekt) verschwenderisch / ineffizient, da ein zusätzliches Array (mit der gleichen Länge wie das Original) erstellt werden muss. Dies bedeutet, dass der Abfall mit dem ursprünglichen Array zunimmt. Dies sollte niemals der effizienten Antwort von Pascal MARTIN vorgezogen werden. Ich bin überrascht, dass dies so viele positive Stimmen hat.
Mickmackusa
12

Ab PHP7.3 können Sie mit array_key_last () direkt auf den letzten Schlüssel in (der äußeren Ebene) eines Arrays zugreifen.

Das bringt definitiv einen Großteil der Debatte auf dieser Seite ins Bett. Es ist zweifellos der beste Darsteller, hat keine Nebenwirkungen und ist eine direkte, intuitive Single-Call-Technik, um genau das zu liefern, wonach diese Frage sucht.

Ein grober Benchmark als Beweis: https://3v4l.org/hO1Yf

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

* Das Testarray enthält 500000 Elemente. Die Mikrozeit wird 100x wiederholt, dann gemittelt und dann mit 1000 multipliziert, um eine wissenschaftliche Notation zu vermeiden. Dank an @MAChitgarha für den ersten Benchmark , der unter der Antwort von @ TadejMagajna kommentiert wurde .

Dies bedeutet, dass Sie den Wert des endgültigen Schlüssels abrufen können, ohne:

  1. Verschieben des Array-Zeigers (für den zwei Codezeilen erforderlich sind) oder
  2. Sortieren, Umkehren, Poppen, Zählen, Indizieren einer Reihe von Schlüsseln oder andere Dummheiten

Diese Funktion war längst überfällig und eine willkommene Ergänzung des Werkzeuggürtels für Array-Funktionen, die die Leistung verbessert, unerwünschte Nebenwirkungen vermeidet und sauberen / direkten / intuitiven Code ermöglicht.

Hier ist eine Demo :

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

Ausgabe:

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

Einige Notizen:

  • array_key_last()ist die Geschwisterfunktion von array_key_first () .
  • Beide Funktionen sind "Zeiger-ignorant".
  • Beide Funktionen werden zurückgegeben, nullwenn das Array leer ist.
  • Verworfene Geschwisterfunktionen ( array_value_first()& array_value_last()) hätten auch den zeigerunabhängigen Zugang zu Buchstützenelementen geboten, aber sie konnten offensichtlich nicht genügend Stimmen sammeln, um zum Leben zu erwecken.

Hier sind einige relevante Seiten, auf denen die neuen Funktionen erläutert werden:

ps Wenn jemand einige der anderen Techniken abwägt, können Sie sich auf diese kleine Sammlung von Vergleichen beziehen: ( Demo )

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
quelle
2
Diese Antwort sollte ganz oben auf der Liste stehen. Es ist einfach komplett.
John
1
Wow, ein DV auf DIESE Antwort von mir? Was war los, zu umfassend / endgültig / erklärend / unterstützt? Pfft. Drücken Sie auf jeden Fall weiterhin Posts herunter, die es wagen, sich zu informieren. Gut gemacht. Falls Sie es nicht wissen, ist die DV-Taste für Beiträge gedacht, die "nicht nützlich" sind. Bitte fragen Sie sich, was Ihr Ziel hier ist.
Mickmackusa
8

Versuchen Sie, die Funktionen array_pop und array_keys wie folgt zu verwenden:

<?php

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

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

?>
Codaddict
quelle
14
Dies ist sehr langsam, wenn Ihr Array mehr als eine Sache enthält. Bitte tu das nicht.
Andrey
3
und verursacht auch STRICT NOTICE, Variablenreferenz
Wiliam
array_pop () würde das ursprüngliche Array verkürzen (das letzte Element entfernen). Ich bin mir nicht sicher, ob dies für das OP wichtig ist oder nicht, aber es wird sicherlich für andere von Bedeutung sein.
Programster
1
Nicht wirklich. In diesem Beispielarray_pop() der Rückgabewert von array_keys()und nicht das ursprüngliche Array verarbeitet.
Petko Bossakov
Da es andere effizientere Antworten gibt, die keinen HINWEIS auslösen, stimme ich diese Antwort ab.
Mickmackusa
6

Ab PHP ist> = 7.3 array_key_last()der beste Weg, um den letzten Schlüssel eines Arrays zu erhalten. Mit Kombination aus end(), key()und reset()erst letzten Schlüssel eines Arrays zu erhalten , ist empörend.

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

vergleiche das mit

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

Sie müssen das Array zurücksetzen, damit der Zeiger am Anfang steht, wenn Sie die Kombination von end()und verwendenkey()

Hilary Okoro
quelle
4

Ich möchte auch eine alternative Lösung für dieses Problem anbieten.

Unter der Annahme, dass alle Ihre Schlüssel ohne Lücken numerisch sind, besteht meine bevorzugte Methode darin, das Array zu zählen und dann minus 1 von diesem Wert (um die Tatsache zu berücksichtigen, dass Array-Schlüssel bei 0 beginnen.

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

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

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

Dies würde Ihnen geben:

int (1) cat


quelle
1
Dies funktioniert nicht für Arrays, bei denen die Schlüssel nicht inkrementell sind, z. B. Array (0 => 'Hund', 5 => 'Katze'); $ lastKey würde einen falschen Wert zurückgeben
kakoma
@kakoma - Wie mein Beitrag sagt "Angenommen, alle Ihre Schlüssel sind numerisch ohne Lücken".
Für alle, die sich fragen, verwenden Sie PHPs "array_values", um das Array in eine numerische Folge umzuwandeln. php.net/manual/en/function.array-values.php
1
Da diese Antwort nur einen Bruchteil der Array-Möglichkeiten (numerische Arrays mit aufeinanderfolgenden Schlüsseln) behandelt, bietet diese Antwort keine robuste / korrekte Antwort auf die allgemeine Frage des OP. Downvote.
Mickmackusa
4

Sie können dies verwenden:

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

Eine andere Lösung besteht darin, eine Funktion zu erstellen und zu verwenden:

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

$array = array("one" => "apple", "two" => "orange", "three" => "pear");
echo endKey($array);
Atif Tariq
quelle
1
Diese Antwort enthält nichts Neues, das noch nicht in diesem Thread enthalten ist.
Martin
1
Martin, niemand benutzt die Funktion, um das Ergebnis zu erhalten.
Atif Tariq
1
Müssen Sie einer Funktion 1 Codezeile hinzufügen? Das ist eine ziemlich unnötige Schnittstelle.
Martin
1
Martin, welche eine Zeile.
Atif Tariq
2
die Linie in Ihrer Funktion
Martin
3
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'value3');
list($last_key) = each(array_reverse($arr));
print $last_key;
// key3
voodoo417
quelle
2
Das Umkehren des gesamten Arrays, um nur einen Wert abzurufen, ist sicherlich weniger effizient als die Methode von PascalMARTIN. Obwohl es technisch korrekt ist, sollte es niemals anstelle von Pascals Ansatz verwendet werden.
Mickmackusa
3

Ich habe gerade die Helfer-Funktion von Xander übernommen und sie mit den vorherigen Antworten verbessert:

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
quelle
1

Versuchen Sie dieses mit array_reverse().

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

Es ist seltsam, aber warum dieses Thema nicht diese Antwort hat:

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

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

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

Dies funktioniert, weil PHP seinen Array-Zeiger intern für $ array verschiebt

Scottymeuk
quelle
2
Dies ist ein Duplikat der PascalMARTIN-Methode. Bitte sparen Sie diese Seite und löschen Sie Ihre verspätete / doppelte Antwort. Abgestimmt.
Mickmackusa
0

Die bestmögliche Lösung, die auch inline verwendet werden kann:

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

Diese Lösung ist nur Ausdruck / Aussage und bietet gute nicht die bestmögliche Leistung.

Inline Beispielverwendung:

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


UPDATE: In PHP 7.3+: Verwenden Sie (natürlich) die neu hinzugefügte array_key_last()Methode.

mvorisek
quelle