OK,
Ich weiß alles über array_pop()
, aber das löscht das letzte Element. Was ist der beste Weg, um das letzte Element eines Arrays zu erhalten, ohne es zu löschen?
EDIT: Hier ist ein Bonus:
$array = array('a' => 'a', 'b' => 'b', 'c' => 'c');
oder auch
$array = array('a', 'b', 'c', 'd');
unset($array[2]);
echo $array[sizeof($array) - 1]; // Output: PHP Notice: Undefined offset: 2 in - on line 4
Antworten:
Die vielen Antworten in diesem Thread bieten uns viele verschiedene Möglichkeiten. Um aus ihnen auswählen zu können, musste ich ihr Verhalten und ihre Leistung verstehen. In dieser Antwort werde ich meine Erkenntnisse mit Ihnen, gebenchmarkt gegen PHP - Versionen gemeinsam nutzen
5.6.38
,7.2.10
und7.3.0RC1
( voraussichtlich 13. Dezember 2018 ).Die Optionen, die
<<option code>>
ich testen werde, sind:$x = array_values(array_slice($array, -1))[0];
( wie von rolacja vorgeschlagen )$x = array_slice($array, -1)[0];
( wie von Stoutie vorgeschlagen )$x = array_pop((array_slice($array, -1)));
( wie von rolacja vorgeschlagen )$x = array_pop((array_slice($array, -1, 1)));
( wie von Westy92 vorgeschlagen )$x = end($array); reset($array);
( wie von Iznogood vorgeschlagen )$x = end((array_values($array)));
( wie von TecBrat vorgeschlagen )$x = $array[count($array)-1];
( wie von Mirko Pagliai vorgeschlagen )$keys = array_keys($array); $x = $array[$keys[count($keys)-1]];
( wie von thrau vorgeschlagen )$x = $array[] = array_pop($array);
( wie von user2782001 vorgeschlagen )$x = $array[array_key_last($array)];
( wie vom Quasimodo-Klon vorgeschlagen ; verfügbar gemäß PHP 7.3)(Erwähnte Funktionen: array_key_last , array_keys , array_pop , array_slice , array_values , count , end , reset )
Die
<<input code>>
zu kombinierenden Testeingänge:$array = null;
$array = [];
$array = ["a","b","c",null];
$array = ["a","b","c","d"];
$array = []; $array[1] = "a"; $array[2] = "b"; $array[0] = "c";
$array = []; for($i=0;$i<100;$i++) { $array[] = $i; }
$array = []; for($i=0;$i<100000;$i++) { $array[] = $i; }
Zum Testen ich das verwenden
5.6.38
,7.2.10
und7.3.0RC1
PHP Docker - Container wie:Jede Kombination der oben aufgeführten
<<option code>>
s und<<input code>>
s wird auf allen PHP-Versionen ausgeführt. Für jeden Testlauf wird das folgende Codefragment verwendet:Bei jedem Lauf wird var_dump den zuletzt abgerufenen letzten Wert der Testeingabe ausgeben und die durchschnittliche Dauer einer Iteration in Femtosekunden (0,000000000000001stel Sekunde) ausgeben .
Die Ergebnisse sind wie folgt:
Das oben erwähnte F Atal, W arnung und N Otice Codes übersetzen , wie:
Basierend auf dieser Ausgabe ziehe ich die folgenden Schlussfolgerungen:
$x = end((array_values($array)));
$keys = array_keys($array); $x = $array[$keys[count($keys)-1]];
$x = end($array); reset($array);
$x = $array[count($array)-1];
$x = $array[] = array_pop($array);
$x = $array[array_key_last($array)];
(seit PHP 7.3)$x = $array[count($array)-1];
(aufgrund der Verwendung voncount
)$x = $array[] = array_pop($array);
(aufgrund der Zuweisung von Wertverlust des Originalschlüssels)$x = end($array); reset($array);
$x = end((array_values($array)));
array_key_last
Funktion scheint keine der oben genannten Einschränkungen zu haben, mit der Ausnahme, dass sie zum Zeitpunkt des Schreibens noch ein RC ist (verwenden Sie also den RC oder warten Sie auf die Veröffentlichung im Dezember 2018):$x = $array[array_key_last($array)];
(seit PHP 7.3)Je nachdem, ob Sie das Array als Stapel oder als Warteschlange verwenden , können Sie Option 9 variieren .
quelle
$array[array_key_last($array)];
zu Ihrem Benchmark. Und bitte benachrichtigen Sie mich, wenn Sie fertig sind. Ich möchte die Leistungsergebnisse im Vergleich sehen.Versuchen
So setzen Sie es zurück (danke @hopeseekr):
Link zum Handbuch
@ David Murdoch fügte hinzu:
$myLastElement = end(array_values($yourArray));// and now you don't need to call reset().
Auf E_STRICT wird die Warnung ausgegebenDanke o_O Tync und allen!
quelle
$myLastElement = end(array_values($yourArray));
und jetzt müssen Sie nicht mehr anrufenreset()
.end(array_values())
wird ein E_STRICT geben: "Nur Variablen sollten als Referenz übergeben werden"end((array_values($yourArray)))
Kurz und bündig.
Ich habe eine Lösung gefunden, um Fehlermeldungen zu entfernen und die Einzeilerform und die effiziente Leistung beizubehalten:
- vorherige Lösung
Hinweis: Die zusätzlichen Klammern werden benötigt, um a zu vermeiden
PHP Strict standards: Only variables should be passed by reference
.quelle
$array = array_slice($array, -1); $lastEl = array_pop($array);
Persönlich denke ich, dass dies besser ist (ohne den Parser 'Bug')array_size() > 1
2. Überprüfen Sie, ob das Array tatsächlich ein Array ist. Ich halte mich immer noch an die Antwort von @Iznogood, da die in PHP integrierteend()
Funktion bereits die ganze harte Arbeit effizienter erledigt.Was ist los mit
array_slice($array, -1)
? (Siehe Handbuch: http://us1.php.net/array_slice )array_slice()
gibt ein Array zurück. Wahrscheinlich nicht das, wonach Sie suchen. Sie wollen das Element.quelle
array_slice($array, -1)[0]
, um das Element zu erhalten.reset(array_slice($array, -1))
ist ein anderer Ansatz (der keinen Fehler verursacht, wennarray_slice()
etwas "kleineres" als ein Einzelelement-Array zurückgegeben wird)array_slice($array, -1)[0] = "";
Eine Möglichkeit, Referenzfehler zu vermeiden (z. B. "end (array_values ($ foo))"), ist die Verwendung von call_user_func oder call_user_func_array:
quelle
end((array_values($yourArray)))
call_user_func
Trick funktioniert auch in PHP 7 nicht. Ich denke, Sie müssen keine temporäre Variable erstellen.Wenn Sie den internen Zeiger nicht ändern möchten (unterstützt sowohl indizierte als auch assoziative Arrays):
Wenn Sie eine Dienstprogrammfunktion wünschen, die den internen Zeiger nicht ändert (da das Array als Wert übergeben wird und die Funktion eine Kopie davon bearbeitet):
Beachten Sie, dass PHP Kopien "on-the-fly" erstellt, dh nur, wenn sie tatsächlich benötigt werden. Das
end()
selbst ändert das Array, sodass intern eine Kopie des Arrays generiert wird.Daher ist die folgende Alternative tatsächlich schneller, da das Array intern nicht kopiert wird, sondern nur ein Slice erstellt wird:
Dieses "foreach / return" ist eine Optimierung, um das erste (und hier einzelne) Element effizient zu erhalten.
Endlich die schnellste Alternative, aber nur für indizierte Arrays:
Für die Aufzeichnung ist hier eine andere Antwort von mir , für das erste Element des Arrays.
quelle
array_last
Funktion. Zum einen geben Sie an, dass das$array
kopiert wird und zum anderen, dass es nicht kopiert wird. Wo ist der Unterschied / warum wird er in der ersten Implementierung und nicht in der zweiten kopiert?ungetestet: würde das nicht funktionieren?
Da das von array_values zurückgegebene Array flüchtig ist, kümmert es niemanden, ob sein Zeiger zurückgesetzt wird.
und wenn Sie den Schlüssel dazu brauchen, würden Sie wahrscheinlich tun:
quelle
Ich brauche das ziemlich oft, um mit Stacks fertig zu werden, und ich bin immer verblüfft, dass es keine native Funktion gibt, die dies tut, ohne das Array oder seinen internen Zeiger in irgendeiner Form zu manipulieren.
Daher trage ich normalerweise eine util-Funktion mit mir herum, die auch auf assoziativen Arrays sicher verwendet werden kann.
quelle
Verwenden Sie Folgendes, um das letzte Element eines Arrays abzurufen:
Benchmark
Ich habe 1.000 Mal iteriert und das letzte Element kleiner und großer Arrays mit 100 bzw. 50.000 Elementen erfasst.
Ich habe PHP Version 5.5.32 verwendet.
quelle
end () liefert das letzte Element eines Arrays
quelle
Ab PHP Version 7.3 wurden die Funktionen
array_key_first
undarray_key_last
eingeführt.Da Arrays in PHP keine strengen Array-Typen sind, dh Sammlungen von Feldern mit fester Größe ab Index 0, sondern dynamisch erweiterte assoziative Arrays, ist die Behandlung von Positionen mit unbekannten Schlüsseln schwierig und Problemumgehungen funktionieren nicht sehr gut. Im Gegensatz dazu würden reale Arrays sehr schnell intern über Zeigerarithmethik adressiert, und der letzte Index ist bereits zur Kompilierungszeit durch Deklaration bekannt.
Zumindest das Problem mit der ersten und letzten Position wird jetzt seit Version 7.3 durch eingebaute Funktionen gelöst. Dies funktioniert sogar ohne Warnungen bei sofort einsatzbereiten Array-Literalen :
Offensichtlich ist der letzte Wert :
quelle
$ Array-Zeiger werden nicht geändert. Dies vermeidet das
was unter bestimmten Bedingungen möglicherweise nicht erwünscht ist.
quelle
Für mich:
Mit Mitarbeitern:
quelle
Die besten Antworten sind großartig, aber wie von @ paul-van-leeuwen und @ quasimodos-clone erwähnt, wird PHP 7.3 zwei neue Funktionen einführen, um dieses Problem direkt zu lösen - array_key_first () und array_key_last () .
Sie können diese Syntax heute mit den folgenden Polyfill- (oder Shim-) Funktionen verwenden.
Vorsichtsmaßnahme: Dies erfordert PHP 5.4 oder höher.
quelle
Um dies zu tun und das E_STRICT zu vermeiden und nicht mit dem internen Zeiger des Arrays herumzuspielen, können Sie Folgendes verwenden:
lelement funktioniert nur mit einer Kopie, sodass der Zeiger des Arrays nicht beeinflusst wird.
quelle
Eine andere Lösung:
quelle
Noch eine mögliche Lösung ...
quelle
Wie wäre es mit:
$array == []
(zurückfalse
)quelle
Sie erhalten das letzte Element einfach aus einem Array, indem Sie die folgende Logik verwenden
Nicht nur das letzte Element, sondern Sie können auch das vorletzte, drittletzte usw. erhalten, indem Sie die folgende Logik verwenden.
Für das vorletzte Element müssen Sie in der obigen Anweisung nur die Nummer 2 übergeben, zum Beispiel:
echo ($ array [count ($ array) -2]);
quelle
So erhalten Sie den letzten Wert von Array:
Zum Entfernen des Formulararrays für den letzten Wert:
quelle
array_slice($arr,-1,1)
wird zu einem anderen Array mit der Länge 1 führen, nicht das letzte Element$a=array("red","green","blue","yellow","brown"); print_r(array_slice($a,-1,1));
Ergebnis:Array ( [0] => brown )
Einfach:
$last_element = end((array_values($array)))
Setzt das Array nicht zurück und gibt keine STRICT-Warnungen aus.
PS. Da die am häufigsten gewählte Antwort immer noch nicht die doppelte Klammer enthält, habe ich diese Antwort eingereicht.
quelle
Ich denke, dies ist eine leichte Verbesserung gegenüber allen vorhandenen Antworten:
end()
oder mit Lösungenarray_keys()
, insbesondere bei großen Arraysquelle
array_values
auf dem Einzelelement-Slice)Verwenden Sie die Funktion end ().
quelle
Heutzutage würde ich es vorziehen, immer diesen Helfer zu haben, wie in einer Antwort von php.net/end vorgeschlagen .
Dadurch bleibt der Zeiger immer unverändert, und wir müssen uns nie um Klammern, strenge Standards oder was auch immer kümmern.
quelle
Hinweis: Für (PHP 7> = 7.3.0) können wir array_key_last verwenden - Ruft den letzten Schlüssel eines Arrays ab
Ref: http://php.net/manual/en/function.array-key-last.php
quelle
Was ist, wenn Sie das letzte Element des Arrays innerhalb der Schleife des Arrays erhalten möchten?
Der folgende Code führt zu einer Endlosschleife:
Die Lösung ist für nicht assoziative Arrays offensichtlich einfach:
quelle
quelle
Ab PHP 7.3
array_key_last
ist verfügbarquelle
Sehr einfach
quelle
$a = array(); $a[2] = 'c'; $a[1] = 'b'; echo end($a);
wird zurückkehrenb
meine einfache Lösung, hübsch und leicht zu verstehen.
quelle