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.
@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!
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.
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?
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.
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.
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.
* 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:
Verschieben des Array-Zeigers (für den zwei Codezeilen erforderlich sind) oder
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.
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:
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.
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.
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.
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".
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.
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:
Antworten:
Eine Lösung wäre, eine Kombination aus
end
und (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:
Wird ausgegeben:
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.quelle
reset()
) ;; Aber Sie haben Recht, wenn Sie auf diese Funktion hinweisen, die nützlich sein könnte.array('a', 'b', 'c', 'd', 'a')
es wird Schlüssel 0 statt 4 zurückgeben.Obwohl
end()
es am einfachsten zu sein scheint, ist es nicht das schnellste. Die schnellere und viel stärkere Alternative istarray_slice()
:Wie die Tests sagen , ist es auf einem Array mit 500000 Elementen fast 7x schneller!
quelle
end($arr);$key = key($arr);reset($arr);
mit (b) verglichen$key = key(array_slice($arr,-1,1,true));
... was dazu führte, dassend()
ich VIEL schneller war! end () = 0.05326 Sekunden, array_slice = 8.506 Sekunden ... huh ??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]; }
last
auf das letzte Element. Soend()
ziemlich O machen (1). :-)ich bevorzuge
quelle
end((array_keys($myarr)))
, um den Hinweis zu umgehen.Seit PHP 7.3 (2018) gibt es dafür (endlich) eine Funktion: http://php.net/manual/en/function.array-key-last.php
wird ausgegeben
quelle
Benutz einfach :
echo $array[count($array) - 1];
quelle
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$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.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.
quelle
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
Dies bedeutet, dass Sie den Wert des endgültigen Schlüssels abrufen können, ohne:
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 :
Ausgabe:
Einige Notizen:
array_key_last()
ist die Geschwisterfunktion von array_key_first () .null
wenn das Array leer ist.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 )
quelle
Versuchen Sie, die Funktionen array_pop und array_keys wie folgt zu verwenden:
quelle
array_pop()
der Rückgabewert vonarray_keys()
und nicht das ursprüngliche Array verarbeitet.Ab PHP ist> = 7.3
array_key_last()
der beste Weg, um den letzten Schlüssel eines Arrays zu erhalten. Mit Kombination ausend()
,key()
undreset()
erst letzten Schlüssel eines Arrays zu erhalten , ist empörend.vergleiche das mit
Sie müssen das Array zurücksetzen, damit der Zeiger am Anfang steht, wenn Sie die Kombination von
end()
und verwendenkey()
quelle
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.
Dies würde Ihnen geben:
quelle
Sie können dies verwenden:
Eine andere Lösung besteht darin, eine Funktion zu erstellen und zu verwenden:
quelle
quelle
Ich habe gerade die Helfer-Funktion von Xander übernommen und sie mit den vorherigen Antworten verbessert:
quelle
Versuchen Sie dieses mit
array_reverse()
.quelle
Es ist seltsam, aber warum dieses Thema nicht diese Antwort hat:
$lastKey = array_keys($array)[count($array)-1];
quelle
Dies funktioniert, weil PHP seinen Array-Zeiger intern für $ array verschiebt
quelle
Die bestmögliche Lösung, die auch inline verwendet werden kann:
Diese Lösung ist nur Ausdruck / Aussage und bietet gute nicht die bestmögliche Leistung.
Inline Beispielverwendung:
UPDATE: In PHP 7.3+: Verwenden Sie (natürlich) die neu hinzugefügte
array_key_last()
Methode.quelle