821 Stimmen

Den ersten Schlüssel in einem (möglicherweise) assoziativen Array abrufen?

Wie kann man am besten den ersten Schlüssel in einem möglicherweise assoziativen Array ermitteln? Mein erster Gedanke ist es, nur foreach das Array und dann sofort brechen, wie diese:

foreach ($an_array as $key => $val) break;

So mit $key enthalten den ersten Schlüssel, aber das scheint ineffizient. Hat jemand eine bessere Lösung?

1428voto

Blixt Punkte 48333

Update 2019

Ausgehend von PHP 7.3 gibt es eine neue eingebaute Funktion namens array_key_first() die den ersten Schlüssel aus dem angegebenen Array abruft, ohne den internen Zeiger zurückzusetzen. Prüfen Sie die Dokumentation für weitere Informationen.


Sie können verwenden reset y key :

reset($array);
$first_key = key($array);

Es ist im Wesentlichen dasselbe wie Ihr ursprünglicher Code, aber mit etwas weniger Overhead, und es ist offensichtlicher, was passiert.

Denken Sie einfach daran, anzurufen reset oder Sie können jeden beliebigen Schlüssel im Array erhalten. Sie können auch end anstelle von reset um den letzten Schlüssel zu erhalten.

Wenn Sie wollten, dass der Schlüssel den ersten Wert erhält, reset es tatsächlich zurückgibt:

$first_value = reset($array);

Es gibt jedoch einen Sonderfall, auf den Sie achten müssen (prüfen Sie also zuerst die Länge des Arrays):

$arr1 = array(false);
$arr2 = array();
var_dump(reset($arr1) === reset($arr2)); // bool(true)

86voto

troelskn Punkte 110542

array_keys gibt ein Array von Schlüsseln zurück. Nehmen Sie den ersten Eintrag. Alternativ können Sie auch reset auf dem Array, und anschließend key . Der letztere Ansatz ist wahrscheinlich etwas schneller (obwohl ich es nicht getestet habe), aber er hat den Nebeneffekt, dass der interne Zeiger zurückgesetzt wird.

55voto

Webmut Punkte 2191

Interessanterweise ist die foreach-Schleife die effizienteste Art, dies zu tun.

Da der Auftraggeber speziell nach der Effizienz gefragt hat, sollte darauf hingewiesen werden, dass alle derzeitigen Antworten in der Tat viel weniger effizient sind als ein foreach.

Ich habe einen Benchmark mit php 5.4 durchgeführt, und die reset/key pointer-Methode (akzeptierte Antwort) scheint etwa 7 mal langsamer zu sein als ein foreach. Andere Ansätze, die das gesamte Array manipulieren (array_keys, array_flip) sind offensichtlich noch langsamer als das und werden viel schlechter, wenn man mit einem großen Array arbeitet.

Foreach ist keineswegs ineffizient, nutzen Sie es ruhig!

Edit 2015-03-03:

Benchmark-Skripte wurden angefordert, ich habe die Original-Skripte nicht mehr und habe stattdessen einige neue Tests gemacht. Dieses Mal fand ich foreach nur etwa doppelt so schnell wie reset/key. Ich habe ein Array mit 100 Schlüsseln verwendet und jede Methode eine Million Mal durchlaufen lassen, um einen merklichen Unterschied zu erhalten, hier ist der Code des einfachen Benchmarks:

$array = [];
for($i=0; $i < 100; $i++)
    $array["key$i"] = $i;

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    foreach ($array as $firstKey => $firstValue) {
        break;
    }
}
echo "foreach to get first key and value: " . (microtime(true) - $start) . " seconds <br />";

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    $firstValue = reset($array);
    $firstKey = key($array);
}
echo "reset+key to get first key and value: " . (microtime(true) - $start) . " seconds <br />";

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    reset($array);
    $firstKey = key($array);
}
echo "reset+key to get first key: " . (microtime(true) - $start) . " seconds <br />";

for($i=0, $start = microtime(true); $i < 1000000; $i++) {
    $firstKey = array_keys($array)[0];
}
echo "array_keys to get first key: " . (microtime(true) - $start) . " seconds <br />";

Auf meinem php 5.5 wird dies ausgegeben:

foreach to get first key and value: 0.15501809120178 seconds 
reset+key to get first key and value: 0.29375791549683 seconds 
reset+key to get first key: 0.26421809196472 seconds 
array_keys to get first key: 10.059751987457 seconds

Reset+Taste http://3v4l.org/b4DrN/perf#tabs
foreach http://3v4l.org/gRoGD/perf#tabs

39voto

jimyi Punkte 29803

key($an_array) wird Ihnen den ersten Schlüssel geben

edit per Blixt: Sie sollten anrufen reset($array); avant key($an_array) um den Zeiger auf den Anfang des Arrays zurückzusetzen.

37voto

Stopper Punkte 506

Sie könnten versuchen

array_keys($data)[0]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X