Holen Sie sich das erste Element eines Arrays

1071

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_shiftist dies keine gute Lösung.

Wie kann ich das machen?

hsz
quelle
1
Was meinst du damit, kann nicht als Referenz gemacht werden?
cjk
Die Funktion sollte nicht &$arrayals Parameter funktionieren.
hsz
4
Ich vermute, dass Sie "wirklich" mit "kann nicht als Referenz ausgeführt werden" meinen, dass Ihr Array dynamisch aus einer Datenbank zurückgegeben wird und Sie das Array nicht an eine Variable übergeben möchten, bevor Sie das erste Element übernehmen davon. Wenn ich recht habe, ist die überwiegende Mehrheit aller unten aufgeführten Lösungen (einschließlich der akzeptierten Antwort) unzureichend.
Cartbeforehorse
Müssen Sie es nur abrufen oder abrufen und aus dem vorhandenen Array entfernen?
Jo Smo
Für die grundlegende Verwendung von Arrays können Sie diesen Link technofusions.com/introduction-to-arrays-in-php
Vikrant Vir Bhalla

Antworten:

1367

Ursprüngliche Antwort, aber teuer (O (n)):

array_shift(array_values($array));

In O (1):

array_pop(array_reverse($array));

Andere Anwendungsfälle usw ...

Wenn das Ändern (im Sinne des Zurücksetzens von Array-Zeigern) von $arraykein Problem darstellt, können Sie Folgendes verwenden:

reset($array);

Dies sollte theoretisch effizienter sein, wenn eine Array- "Kopie" benötigt wird:

array_shift(array_slice($array, 0, 1));

Mit PHP 5.4+ (kann aber einen Indexfehler verursachen, wenn leer):

array_values($array)[0];
blau gefärbt
quelle
77
+1 für die clevere Problemumgehung, um zu verhindern, dass das ursprüngliche Array mit array_values ​​()
geändert wird
44
Ich verstehe Folgendes: <b> Strenge Standards </ b>: Nur Variablen sollten als Referenz übergeben werden. Nizza Workaround übrigens
Simone
191
Ist das nicht ein bisschen übertrieben? Was ist, wenn das Array mehrere tausend Elemente enthält? Ist es gerechtfertigt, ein ganz neues Array zu erstellen, um das erste Element zu erhalten? list()und reset()sind meiner Meinung nach viel schönere Lösungen.
Martin Dimitrov
33
Genau. Total Overkill und außerordentlich ressourcenintensiv im Vergleich zu einer Zeile, die den aktuellen Wert zurücksetzt und zurückgibt: reset ($ array);
Zmonteca
48
-1 Wie die obigen Kommentatoren gesagt haben. Es ist verwirrend für mich, dass dies 101 positive Stimmen hat.
Leichtigkeitsrennen im Orbit
789

Wie Mike betonte (der einfachste Weg):

$arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )
echo reset($arr); // Echoes "apple"

Wenn Sie den Schlüssel erhalten möchten: (führen Sie ihn nach dem Zurücksetzen aus)

echo key($arr); // Echoes "4"

Aus der PHP-Dokumentation :

gemischter Reset (Array & $ Array );

Beschreibung:

reset () spult den internen Zeiger des Arrays auf das erste Element zurück und gibt den Wert des ersten Array-Elements zurück oder FALSE, wenn das Array leer ist.

Lepe
quelle
Obwohl es als Referenz zum Zurücksetzen übergeben wird, wird das ursprüngliche Array nicht geändert. Ich vermute, das ist der Grund, warum hsz es nicht als Referenz weitergeben möchte.
Dennis Jamin
10
Der Iterator des Arrays wird geändert. Wenn Sie dies in einem foreachmit dem Betreff-Array tun , werden Sie es vermasseln.
Zenexer
2
@Zenexer das ist nicht immer (normalerweise) wahr. Normalerweise wird in der Praxis foreachdas Array kopiert, das durchlaufen wird.
Luke Cousins
1
@ Angger nach dem Zurücksetzen können Sie anrufen key($arr)und Sie erhalten '4' (in Antwort hinzugefügt)
Lepe
3
Weder @Zenexer noch Luke Cousins ​​haben Recht: 1) foreach verwendet keinen internen Zeiger eines Arrays, sondern erstellt einen eigenen Zeiger. Es ist einfach zu überprüfen, ob der Aufruf in foreach zurückgesetzt wurde - die Schleife folgt ihrem Weg ohne Auswirkung von 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 und next()vor foreach aufzurufen ).
Dmikam
278
$first_value = reset($array); // First element's value
$first_key = key($array); // First element's key
Ijas Ameenudeen
quelle
2
Ich habe es nicht wirklich getestet, aber es scheint, dass dieser Ansatz der effizienteste wäre.
Mason81
4
Das einzige Problem ist die Frage nach dem Wert, nicht nach dem Schlüssel. Daher sollte current ($ array) anstelle von key ($ array) verwendet werden
zmonteca
4
@zmonteca $ first_value = reset ($ array); Hier erhalten Sie den Wert. Die Funktion reset () spult den internen Zeiger des Arrays zurück und gibt das erste Element zurück.
S3Mi
1
die beste Antwort! suchte nach key () Äquivalenz, um den ersten Wert zu erhalten. Das hilft!
Alain Tiemblo
98
$arr = array( 9 => 'apple', 7 => 'orange', 13 => 'plum' );
echo reset($arr); // echoes 'apple'

Wenn Sie die aktuelle Zeigerposition nicht verlieren möchten, erstellen Sie einfach einen Alias ​​für das Array.

Yoda
quelle
1
habe es nicht verstanden, was meinst du? Es funktioniert gut, ob der Schlüssel des ersten größer ist als der der anderen.
Yoda
29
+1 FYI gibt reset()bereits das erste Element zurück, so dass es nicht notwendig ist current()- echo reset($arr)sollte ausreichen
Mike
@ Mike , aber Sie könnten es vorziehen , currentzu resetPHP Hinweis / Fehler in Referenzfall erzeugt zu vermeiden, zum Beispiel current(array_filter(...));in 3v4l .
CPHPython
91

current($array)Sie können das erste Element eines Arrays gemäß dem PHP-Handbuch erhalten .

Jedes Array hat einen internen Zeiger auf sein "aktuelles" Element, der auf das erste in das Array eingefügte Element initialisiert wird.

Es funktioniert also so lange, bis Sie den Array-Zeiger neu positioniert haben. Andernfalls müssen Sie das Array zurücksetzen.

Tofeeq
quelle
4
Ich weiß nicht, warum dies nicht die akzeptierte Antwort war, da sie die Frage ziemlich einfach und genau beantwortet.
Relipse
26
current($array)funktioniert nur, wenn der Array-Zeiger "aktuell" auf das erste Element zeigt, andernfalls reset($array)wäre dies erforderlich.
Jon
6
Es scheint current()keine Referenz mehr zu erfordern, obwohl die PHP-Dokumente dies nicht widerspiegeln. Ich denke, dies ist die beste Lösung geworden.
Ryan
@ Ryan stimmte zu, aber diese Lösung wurde 2 Jahre vor 2014 in dieser anderen Antwort des gleichen Threads gegeben ... Seltsam, dass dieser unvollständige Satz mehr positive Stimmen bekam.
CPHPython
70

Sie können das N-te Element mit dem Sprachkonstrukt "list" erhalten:

// First item
list($firstItem) = $yourArray;

// First item from an array that is returned from a function
list($firstItem) = functionThatReturnsArray();

// Second item
list( , $secondItem) = $yourArray;

Mit der array_keysFunktion können Sie dasselbe für Tasten tun:

list($firstKey) = array_keys($yourArray);
list(, $secondKey) = array_keys($yourArray);
Sergiy Sokolenko
quelle
2
Genau das mache ich: 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 ...
J. Bruni
6
Sehr elegante Lösung, löst aber eine E_NOTICE aus, wenn das Array leer ist.
Tgr
1
@ Mike ja, aber dann ist es nicht mehr so ​​elegant :)
Tgr
13
Ist das nicht falsch?! Es funktioniert nur, wenn Array-Schlüssel sind int, versuchen Sie es list($firstItem) = array('key1' => 'value1');und Sie werden eine Fehlermeldung erhaltenNotice: Undefined offset: 0
Marco Demaio
12
Zur Verdeutlichung: 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.
Warbo
55

PHP 5.4+:

array_values($array)[0];
Samer Ata
quelle
Dies ist für die coolen Leute, die die neuesten und besten betreiben. ;)
Zenexer
1
Er hat seine Antwort im Oktober 2013 bearbeitet, um meine Antwort aufzunehmen, die ich im April hinzugefügt habe.
Samer Ata
PHP 4:$array_values = array_values($array); $value = $array_values[0];
Zdick
38

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

$my_array = ['IT', 'rules', 'the', 'world'];

$first_key = array_key_first($my_array);
$first_value = $my_array[$first_key];

$last_key = array_key_last($my_array);
$last_value = $my_array[$last_key];

Abrufen des ersten / letzten Werts als Einzeiler, vorausgesetzt, das Array kann nicht leer sein :

$first_value = $my_array[ array_key_first($my_array) ];

$last_value = $my_array[ array_key_last($my_array) ];

Abrufen des ersten / letzten Werts als Einzeiler mit Standardeinstellungen für leere Arrays:

$first_value = empty($my_array) ? 'default' : $my_array[ array_key_first($my_array) ];

$last_value = empty($my_array) ? 'default' : $my_array[ array_key_last($my_array) ];
Alex Shesterov
quelle
Kürzen Sie mit dem Null-Koaleszenz-Operator , normalerweise ist Null die Standardeinstellung: $first_value = $my_array[array_key_first($my_array)] ?? null;
Mitchell McKenna
29

Annehmen:

$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

Benutz einfach:

$array[key($array)]

erstes Element bekommen oder

key($array)

um den ersten Schlüssel zu bekommen.

Oder Sie können die erste Verknüpfung aufheben, wenn Sie sie entfernen möchten.

Lucas
quelle
9
Was dann nicht einfach benutzen current?
Marco Demaio
27

Einige Arrays funktionieren nicht mit Funktionen wie list, resetodercurrent . 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:

foreach($array_with_unknown_keys as $value) break;

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:

foreach($array_with_unknown_keys as $key=>$value) break;

Wenn Sie dies von einer Funktion aus aufrufen, kehren Sie einfach frühzeitig zurück:

function grab_first($arr) {
    foreach($arr as $value) return $value;
}
Lee Benson
quelle
Ich nehme an, dies ist einer der schnellsten Wege, da das Sprachkonstrukt foreach anstelle eines Funktionsaufrufs (der teurer ist) verwendet wird. designcise.com/web/tutorial/…
Ildar Amankulov
19

Von Laravels Helfern :

function head($array)
{
    return reset($array);
}

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 wirdfalseWenn das Array als wenn das Array leer ist).

Anwendungsbeispiel:

$data = ['foo', 'bar', 'baz'];

current($data); // foo
next($data); // bar
head($data); // foo
next($data); // baz

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:

function head($array, $default = null)
{
    foreach ($array as $item) {
        return $item;
    }
    return $default;
}

Für die Aufzeichnung ist hier eine andere Antwort von mir , für das letzte Element des Arrays.

Gras Double
quelle
17

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 ab


EDIT:
In Bezug auf die Kommentare unten. Das folgende Beispiel wird ausgegeben:string(13) "PHP code test"

$array = array
(
   '1'           => 'PHP code test',  
   'foo'         => 'bar', 5 , 5 => 89009, 
   'case'        => 'Random Stuff: '.rand(100,999),
   'PHP Version' => phpversion(),
   0             => 'ending text here'
);

var_dump(current($array));
tfont
quelle
11
Uhh. currententspricht dem aktuellen Element. Sie müssen den Zeiger auf den Anfang des Arrays zurücksetzen, um sicherzustellen, dass er tatsächlich am Anfang steht.
Waterloomatt
current () erhält das aktuelle Element, nicht das erste Element. Es ist anders.
Amirhossein Tarmast
current funktioniert, wenn nur ein Element im Array vorhanden ist.
Zameer Fouzan
15

Einfach machen:

array_shift(array_slice($array,0,1));
DiverseAndRemote.com
quelle
14

Ich würde es tun echo current($array).

user1485518
quelle
1
@hsz spielt keine Rolle, current()macht keinen Fehler, wenn Nichtreferenzen übergeben werden. Vorausgesetzt, der Zeiger befindet sich noch am Anfang, funktioniert dies.
Dan Lugg
aber es erzeugt eine Mitteilung, die Ihre Protokolle schmutzig und gut macht ... Sie sollten Mitteilungen auch wven loswerden, wenn sie nicht kritisch sind
dmikam
1
@dmikam nein tut es nicht. resetErzeugt 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(...)); .
CPHPython
@CPHPython, scheint, als ob Sie Recht haben ... es sieht so aus, als hätte ich diese Idee von Strom aus alten Zeiten von PHP 4, wo er wirklich schwerwiegende Fehler verursacht: sandbox.onlinephpfunctions.com/code/… Das einzige Problem, das ich bei der Verwendung von Strom sehe, ist dass es nicht garantiert, dass das zurückgegebene Element das erste Element eines Arrays ist (der interne Zeiger kann durch die aufgerufene Funktion geändert werden). Praktisch kann es zufälliges Element eines Arrays zurückgeben.
Dmikam
1
@CPHPython Ein etwas künstliches Beispiel, aber es zeigt gut meine Gedanken: sandbox.onlinephpfunctions.com/code/… Stellen Sie sich vor, Sie erhalten Ihr Array von einer Funktion, die verwendet next(), end()oder von einer anderen Funktion, die den internen Zeiger des Arrays ändert. In meinem Beispiel wird current()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.
Dmikam
13
$arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
foreach($arr as $first) break;
echo $first;

Ausgabe:

apple
Tekin
quelle
10
$myArray = array (4 => 'apple', 7 => 'orange', 13 => 'plum');
$arrayKeys = array_keys($myArray);

// The first element of your array is:
echo $myArray[$arrayKeys[0]];
Jacob Topping
quelle
Ich bin nicht den Weg gegangen, den es in der akzeptierten Antwort beschrieben hat. Verwendet Ihren Dank
JayKandari
9
$array=array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

$firstValue = each($array)[1];

Dies ist viel effizienter als array_values()weil die each()Funktion nicht das gesamte Array kopiert.

Weitere Informationen finden Sie unter http://www.php.net/manual/en/function.each.php

Rustyx
quelle
because the each() function does not copy the entire array.+1
2
Aber die Sache ist, dass Sie vorher einen Reset durchführen sollten, wenn der interne Zeiger nicht am Anfang steht, werden Sie nicht das erste Element erhalten.
Carlos Goce
Aber jeder () erhält ein Array als Referenz und die Anforderung der ersten Fragen besteht nicht darin
dmikam
8

Ein klobiger Weg ist:

$foo = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

function get_first ($foo) {
    foreach ($foo as $k=>$v){
        return $v;
    }
}

print get_first($foo);
William Macdonald
quelle
3
Zumindest bist du ehrlich - es ist klobig! Aber es funktioniert und ich habe es in der Vergangenheit verwendet, bis ich die list () - Technik oben gelernt habe.
random_user_name
1
Wenn Sie dies tun, können Sie genauso gut verwenden, reset()wie der Array-Zeiger zurückgesetzt wird, bevor foreacher trotzdem aufgerufen wird.
Tyzoid
7

Holen Sie sich das erste Element:

array_values($arr)[0]

Holen Sie sich das letzte Element

array_reverse($arr)[0]
Adobe
quelle
Numerische Schlüssel bleiben mit array_reverse erhalten, sodass immer noch das erste Element zurückgegeben wird. 3v4l.org/2729s
Keine Panik
7

Die meisten davon funktionieren! ABER für einen schnellen Anruf in einer Leitung (mit geringen Ressourcen):

$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
echo $array[key($array)];

// key($array) -> will return the first key (which is 4 in this example)

Obwohl dies funktioniert und anständig gut ist, lesen Sie bitte auch meine zusätzliche Antwort: https://stackoverflow.com/a/48410351/1804013

tfont
quelle
5
Dies entspricht der Verwendung von current($array), die erfordert, dass sich der interne Zeiger des Arrays ohnehin am ersten Element befindet. In diesem Fall echo reset($array)ist dies am besten geeignet.
Tyzoid
@ Tyzoid er hat hier tatsächlich eine andere Antwort mit Ihrem Vorschlag geschrieben , aber er hat Ihre Erklärung weggelassen ... Danke.
CPHPython
@ Tyzoid: Ich habe eine zusätzliche Antwort / Aktualisierung für eine Weile gemacht: stackoverflow.com/a/48410351/1804013
tfont
5

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.

jmking
quelle
5

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:

<?php
    $original = array(4 => array('one', 'two'), 7 => array('three', 'four'));
    reset($original);  // to reset the internal array pointer...
    $first_element = current($original);  // get the current element...
?>

Dank all der aktuellen Lösungen, die mir geholfen haben, zu dieser Antwort zu gelangen, hoffe ich, dass dies irgendwann jemandem hilft!

Chris Kempen
quelle
4

Verwenden:

$first = array_slice($array, 0, 1);  
$val= $first[0];

Standardmäßig werden array_slicekeine Schlüssel beibehalten, sodass wir sicher Null als Index verwenden können.

Bazi
quelle
4

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. :) :)

<?php
    // Get the first element of this array.
    $array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

    // Gets the first element by key
    $result = $array[4];

    // Expected result: string apple
    assert('$result === "apple" /* Expected result: string apple. */');
?>

Lösung 2 - array_flip () + key ()

<?php
    // Get first element of this array. Expected result: string apple
    $array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

    // Turn values to keys
    $array = array_flip($array);

    // You might thrown a reset in just to make sure
    // that the array pointer is at the first element.
    // Also, reset returns the first element.
    // reset($myArray);

    // Return the first key
    $firstKey = key($array);

    assert('$firstKey === "apple" /* Expected result: string apple. */');
?>

Lösung 3 - array_keys ()

echo $array[array_keys($array)[0]];
Jens A. Koch
quelle
2

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.

$array1 = array();
$array2 = array(1,2,3,4);
$array3 = array('hello'=>'world', 'foo'=>'bar');
$array4 = null;

var_dump('reset1', reset($array1));
var_dump('reset2', reset($array2));
var_dump('reset3', reset($array3));
var_dump('reset4', reset($array4)); // Warning

var_dump('array_shift1', array_shift($array1));
var_dump('array_shift2', array_shift($array2));
var_dump('array_shift3', array_shift($array3));
var_dump('array_shift4', array_shift($array4)); // Warning

var_dump('each1', each($array1));
var_dump('each2', each($array2));
var_dump('each3', each($array3));
var_dump('each4', each($array4)); // Warning

var_dump('array_values1', array_values($array1)[0]); // Notice
var_dump('array_values2', array_values($array2)[0]);
var_dump('array_values3', array_values($array3)[0]);
var_dump('array_values4', array_values($array4)[0]); // Warning

var_dump('array_slice1', array_slice($array1, 0, 1));
var_dump('array_slice2', array_slice($array2, 0, 1));
var_dump('array_slice3', array_slice($array3, 0, 1));
var_dump('array_slice4', array_slice($array4, 0, 1)); // Warning

list($elm) = $array1; // Notice
var_dump($elm);
list($elm) = $array2;
var_dump($elm);
list($elm) = $array3; // Notice
var_dump($elm);
list($elm) = $array4;
var_dump($elm);

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:

$elm = empty($array) ? null : ...($array);

...you would use without errors:
$array[count($array)-1];
array_shift
reset
array_values
array_slice

array_shiftist schneller als reset, das ist schneller als [count () - 1], und diese drei sind schneller als array_valuesund array_slice.

Steven Koch
quelle
2

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:

$first_item_of_array = current($tmp_arr = mysql_fetch_row(...));
// or
$first_item_of_array = reset($tmp_arr = func_get_my_huge_array());

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.

dmikam
quelle
1

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:

list($x) = some_array();
var_dump($x);

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:

var_dump(call_user_func(function($arr) { list($x) = $arr; return $x; },
                        some_array()));

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:

var_dump(call_user_func(function($arr) { return reset($arr); },
                        array_values(some_array())));

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:

var_dump(call_user_func('reset', array_values(some_array())));
Warbo
quelle
1

Eine kleine Änderung an dem, was Sarfraz gepostet hat, ist:

$array = array(1, 2, 3, 4, 5);
$output = array_slice($array, 0, 1);
print_r ($output);
Jan Detlefsen
quelle
1

Ich mag es nicht, mit dem internen Zeiger des Arrays herumzuspielen, aber es ist auch ineffizient, ein zweites Array mit array_keys()oder zu erstellen array_values(), daher definiere ich dies normalerweise:

function array_first(array $f) {
    foreach ($f as $v) {
        return $v;
    }
    throw new Exception('array was empty');
}
Jesse
quelle
1

Versuche dies:

$fruits = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
echo reset($fruits)."\n";

Wakar Ahmad Khan
quelle