Ich habe ein Array:
array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )
Ich möchte das erste Element dieses Arrays erhalten. Erwartetes Ergebnis: Zeichenfolge apple
Eine Anforderung: Es kann nicht mit Referenzübergabe durchgeführt werden , daher array_shift
ist dies keine gute Lösung.
Wie kann ich das machen?
&$array
als Parameter funktionieren.Antworten:
Ursprüngliche Antwort, aber teuer (O (n)):
In O (1):
Andere Anwendungsfälle usw ...
Wenn das Ändern (im Sinne des Zurücksetzens von Array-Zeigern) von
$array
kein Problem darstellt, können Sie Folgendes verwenden:Dies sollte theoretisch effizienter sein, wenn eine Array- "Kopie" benötigt wird:
Mit PHP 5.4+ (kann aber einen Indexfehler verursachen, wenn leer):
quelle
list()
undreset()
sind meiner Meinung nach viel schönere Lösungen.Wie Mike betonte (der einfachste Weg):
Wenn Sie den Schlüssel erhalten möchten: (führen Sie ihn nach dem Zurücksetzen aus)
Aus der PHP-Dokumentation :
Beschreibung:
quelle
foreach
mit dem Betreff-Array tun , werden Sie es vermasseln.foreach
das Array kopiert, das durchlaufen wird.key($arr)
und Sie erhalten '4' (in Antwort hinzugefügt)reset()
. 2) Nein, foreach erstellt KEINE Kopie eines Arrays !!! Es wird nur ein eigener Zeiger erstellt (nicht einmal eine Kopie eines vorhandenen Zeigers - es ist auch einfach zu überprüfen undnext()
vor foreach aufzurufen ).quelle
Wenn Sie die aktuelle Zeigerposition nicht verlieren möchten, erstellen Sie einfach einen Alias für das Array.
quelle
reset()
bereits das erste Element zurück, so dass es nicht notwendig istcurrent()
-echo reset($arr)
sollte ausreichencurrent
zureset
PHP Hinweis / Fehler in Referenzfall erzeugt zu vermeiden, zum Beispielcurrent(array_filter(...));
in 3v4l .current($array)
Sie können das erste Element eines Arrays gemäß dem PHP-Handbuch erhalten .Es funktioniert also so lange, bis Sie den Array-Zeiger neu positioniert haben. Andernfalls müssen Sie das Array zurücksetzen.
quelle
current($array)
funktioniert nur, wenn der Array-Zeiger "aktuell" auf das erste Element zeigt, andernfallsreset($array)
wäre dies erforderlich.current()
keine Referenz mehr zu erfordern, obwohl die PHP-Dokumente dies nicht widerspiegeln. Ich denke, dies ist die beste Lösung geworden.Sie können das N-te Element mit dem Sprachkonstrukt "list" erhalten:
Mit der
array_keys
Funktion können Sie dasselbe für Tasten tun:quelle
list($first_value) = $my_array;
Meiner Meinung nach die beste Option. Es gibt keine Probleme mit den anderen hier vorgestellten Antworten: kein "Overkill", da weder das Array kopiert noch ein neues erstellt wird. Keine "Referenzen": Das Array wird nicht geändert. Kein "Zurücksetzen": Keine Änderungen am internen Zeiger des Arrays ...int
, versuchen Sie eslist($firstItem) = array('key1' => 'value1');
und Sie werden eine Fehlermeldung erhaltenNotice: Undefined offset: 0
list($x) = foo();
entspricht$x = foo()[0];
. Beachten Sie, dass dies nicht unbedingt mit "Das erste Element abrufen" identisch ist, da selbst ein ganzzahlig indiziertes Array möglicherweise kein Element mit Schlüssel 0 enthält. In meinem Fall habe ich "list ($ order) = get_order ($ user) ausgeführt. ; " "get_order" gab jedoch Bestellungen zurück, die mit ihrer ID verschlüsselt waren, die normalerweise nicht 0 war. Wie @Sergiy sagt, behebt array_values () dies, beeinträchtigt jedoch die Effizienz und (was noch wichtiger ist) die Lesbarkeit des Codes.PHP 5.4+:
quelle
$array_values = array_values($array); $value = $array_values[0];
PHP 7.3 fügte zwei Funktionen hinzu, um den ersten und den letzten Schlüssel eines Arrays direkt abzurufen ohne das ursprüngliche Array zu ändern und ohne temporäre Objekte zu erstellen:
Abgesehen davon, dass diese Funktionen semantisch sinnvoll sind, bewegen sie nicht einmal den Array-Zeiger (wie
foreach
dies der Fall wäre).Mit den Schlüsseln kann man die Werte direkt über die Schlüssel abrufen.
Beispiele (alle erfordern PHP 7.3+)
Erhalten des ersten / letzten Schlüssels und Werts:
Abrufen des ersten / letzten Werts als Einzeiler, vorausgesetzt, das Array kann nicht leer sein :
Abrufen des ersten / letzten Werts als Einzeiler mit Standardeinstellungen für leere Arrays:
quelle
$first_value = $my_array[array_key_first($my_array)] ?? null;
Annehmen:
Benutz einfach:
erstes Element bekommen oder
um den ersten Schlüssel zu bekommen.
Oder Sie können die erste Verknüpfung aufheben, wenn Sie sie entfernen möchten.
quelle
current
?Einige Arrays funktionieren nicht mit Funktionen wie
list
,reset
odercurrent
. Vielleicht handelt es sich um "Faux" -Arrays, die beispielsweise teilweise ArrayIterator implementieren.Wenn Sie den ersten Wert unabhängig vom Array abrufen möchten, können Sie einen Iterator kurzschließen:
Ihr Wert wird dann in verfügbar sein
$value
und die Schleife wird nach der ersten Iteration unterbrochen. Dies ist effizienter als das Kopieren eines potenziell großen Arrays in eine Funktion wie array_unshift (array_values ($ arr)).Sie können den Schlüssel auch folgendermaßen greifen:
Wenn Sie dies von einer Funktion aus aufrufen, kehren Sie einfach frühzeitig zurück:
quelle
Von Laravels Helfern :
Wenn das Array als Wert an die Funktion übergeben wird, wirkt sich reset () auf den internen Zeiger einer Kopie des Arrays aus und berührt das ursprüngliche Array nicht (beachten Sie, dass es zurückgegeben wird
false
Wenn das Array als wenn das Array leer ist).Anwendungsbeispiel:
Auch hier ist eine Alternative. Es ist sehr geringfügig schneller, aber interessanter. Der Standardwert kann leicht geändert werden, wenn das Array leer ist:
Für die Aufzeichnung ist hier eine andere Antwort von mir , für das letzte Element des Arrays.
quelle
Halte das einfach! Hier gibt es viele richtige Antworten, aber um die Verwirrung zu minimieren, funktionieren diese beiden und reduzieren den Overhead:
key($array)
Ruft den ersten Schlüssel eines Arrays ab.current($array)
Ruft den ersten Wert eines Arrays abEDIT:
In Bezug auf die Kommentare unten. Das folgende Beispiel wird ausgegeben:
string(13) "PHP code test"
quelle
current
entspricht dem aktuellen Element. Sie müssen den Zeiger auf den Anfang des Arrays zurücksetzen, um sicherzustellen, dass er tatsächlich am Anfang steht.Einfach machen:
quelle
Ich würde es tun
echo current($array)
.quelle
current()
macht keinen Fehler, wenn Nichtreferenzen übergeben werden. Vorausgesetzt, der Zeiger befindet sich noch am Anfang, funktioniert dies.reset
Erzeugt tatsächlich den Hinweis "Nur Variablen sollten als Referenz übergeben werden" währendcurrent
dies nicht der Fall ist: Beispiel für einen Online-PHP-Editor voncurrent(array_filter(...));
.next()
,end()
oder von einer anderen Funktion, die den internen Zeiger des Arrays ändert. In meinem Beispiel wirdcurrent()
null zurückgegeben, da der interne Zeiger außerhalb des Bereichs des Arrays liegt. Es kann aber auch "virtuell" auf ein beliebiges / zufälliges Element verweisen.Ausgabe:
quelle
quelle
Dies ist viel effizienter als
array_values()
weil dieeach()
Funktion nicht das gesamte Array kopiert.Weitere Informationen finden Sie unter http://www.php.net/manual/en/function.each.php
quelle
because the each() function does not copy the entire array.
+1Ein klobiger Weg ist:
quelle
reset()
wie der Array-Zeiger zurückgesetzt wird, bevorforeach
er trotzdem aufgerufen wird.Holen Sie sich das erste Element:
Holen Sie sich das letzte Element
quelle
Die meisten davon funktionieren! ABER für einen schnellen Anruf in einer Leitung (mit geringen Ressourcen):
Obwohl dies funktioniert und anständig gut ist, lesen Sie bitte auch meine zusätzliche Antwort: https://stackoverflow.com/a/48410351/1804013
quelle
current($array)
, die erfordert, dass sich der interne Zeiger des Arrays ohnehin am ersten Element befindet. In diesem Fallecho reset($array)
ist dies am besten geeignet.Ich denke, die Verwendung von array_values wäre hier die beste Wahl . Sie können den Wert am Index Null aus dem Ergebnis dieser Funktion zurückgeben, um 'apple' zu erhalten.
quelle
Dies ist etwas spät im Spiel, aber ich hatte ein Problem, bei dem mein Array Array-Elemente als untergeordnete Elemente enthielt, und daher konnte ich nicht einfach eine Zeichenfolgendarstellung des ersten Array-Elements erhalten. Mit der PHP-
current()
Funktion habe ich Folgendes geschafft:Dank all der aktuellen Lösungen, die mir geholfen haben, zu dieser Antwort zu gelangen, hoffe ich, dass dies irgendwann jemandem hilft!
quelle
Verwenden:
Standardmäßig werden
array_slice
keine Schlüssel beibehalten, sodass wir sicher Null als Index verwenden können.quelle
Zwei Lösungen für Sie.
Lösung 1 - Verwenden Sie einfach den Schlüssel. Sie haben nicht gesagt, dass Sie es nicht verwenden können. :) :)
Lösung 2 - array_flip () + key ()
Lösung 3 - array_keys ()
quelle
Dies ist in der realen Welt keine so einfache Antwort. Angenommen, wir haben diese Beispiele für mögliche Antworten, die Sie in einigen Bibliotheken finden können.
Wie Sie sehen können, haben wir mehrere "One Line" -Lösungen, die in einigen Fällen gut funktionieren, aber nicht in allen.
Meiner Meinung nach sollten Sie diesen Handler nur mit Arrays haben.
Sprechen wir jetzt über die Leistung, vorausgesetzt, wir haben immer ein Array wie folgt:
array_shift
ist schneller alsreset
, das ist schneller als [count () - 1], und diese drei sind schneller alsarray_values
undarray_slice
.quelle
Ich kann mir vorstellen, dass der Autor nur nach einer Möglichkeit gesucht hat, das erste Element eines Arrays zu erhalten, nachdem es von einer Funktion ( mysql_fetch_row) abgerufen wurde z. B. ) , ohne ein STRICT zu generieren. "Nur Variablen sollten als Referenz übergeben werden".
In diesem Fall erhalten fast alle hier beschriebenen Methoden diese Meldung ... und einige von ihnen verwenden viel zusätzlichen Speicher, um ein Array (oder einen Teil davon) zu duplizieren. Eine einfache Möglichkeit, dies zu vermeiden, besteht darin, den Wert inline zuzuweisen, bevor eine dieser Funktionen aufgerufen wird:
Auf diese Weise erhalten Sie weder die STRICT-Meldung auf dem Bildschirm noch in Protokollen, und Sie erstellen keine zusätzlichen Arrays. Es funktioniert sowohl mit indizierten als auch mit assoziativen Arrays.
quelle
Ich mag das Beispiel "Liste", aber "Liste" funktioniert nur auf der linken Seite einer Aufgabe. Wenn wir keine Variable zuweisen möchten, müssen wir einen temporären Namen erstellen, der bestenfalls unseren Gültigkeitsbereich verschmutzt und im schlimmsten Fall einen vorhandenen Wert überschreibt:
Das Obige überschreibt jeden vorhandenen Wert von $ x und die Variable $ x bleibt bestehen, solange dieser Bereich aktiv ist (das Ende dieser Funktion / Methode oder für immer, wenn wir uns in der obersten Ebene befinden). Dies kann mit call_user_func und einer anonymen Funktion umgangen werden, ist aber umständlich:
Wenn wir anonyme Funktionen wie diese verwenden, können wir tatsächlich mit reset und array_shift davonkommen, obwohl sie Pass-by-Reference verwenden. Dies liegt daran, dass der Aufruf einer Funktion ihre Argumente bindet und diese Argumente als Referenz übergeben werden können:
Dies ist jedoch tatsächlich ein Overkill, da call_user_func diese temporäre Zuweisung intern ausführt. Auf diese Weise können wir Pass-by-Reference-Funktionen so behandeln, als wären sie Pass-by-Value-Funktionen, ohne Warnungen oder Fehler:
quelle
Eine kleine Änderung an dem, was Sarfraz gepostet hat, ist:
quelle
Ich mag es nicht, mit dem internen Zeiger des Arrays herumzuspielen, aber es ist auch ineffizient, ein zweites Array mit
array_keys()
oder zu erstellenarray_values()
, daher definiere ich dies normalerweise:quelle
Versuche dies:
quelle