Ausgehend von einem Array $arr und einer gewünschten Position x (Zählung beginnend bei 0) kann das Element an Position $x im Array $arr ausgelesen werden über:
- Falls Array fortlaufend durchnummeriert, beginnend mit 0 (0, 1, 2, ...): $gesucht = $arr[$x];
- Sonst: $value = current(array_slice($arr, $x, 1));, oder alternativ: $values = array_values($arr); $gesucht = $values[$x];
Hinweis: Es sollte vorher geprüft werden, ob das Array überhaupt genügend Elemente enthält, um eines an Position x zu haben.
1. Einleitung
Im nachfolgenden Artikel werden mögliche Wege präsentiert, um aus einem Array das Element an Position x (Zählung beginnend bei 0) auszulesen. Die Arrays in denen dieses Element gesucht werden soll lassen sich in drei Gruppen einteilen:
- Arrays, deren Schlüssel von 0 an fortlaufend durchnummeriert sind (0, 1, 2, ...): Hier ist das Suchen trivial, x entspricht dem Schlüssel.
- Arrays, deren Schlüssel von n an fortlaufend durchnummeriert mit n≠0 durchnummeriert sind (zum Beispiel 10, 11, 12, ...): Lassen sich sowohl mit den Methoden der ersten oder dritten Gruppen handhaben (Methoden der ersten Gruppe nur mit Umrechnung).
- Arrays, deren Schlüssel nicht durchnummeriert sind (oder zumindest nicht fortlaufend): Hier gibt es mehrere Wege, die Verwendung von array_values() ist der Einfachste.
Der Einfachheit halber wird in keinem der nachfolgenden Beispiele zuvor geprüft, ob das Array überhaupt genügend Elemente enthält, um einen Wert an Position x haben zu können. Dies kann geprüft werden mit x < count($arr)-1 (minus eins, da zum Beispiel bei einem Array mit einem Element dieses Element den Index 0 hat, count($arr) aber 1 ergibt).
2. Bei fortlaufend durchnummerierten Arrays, beginnend mit 0
Bei Arrays, die fortlaufend von 0 an durchnummeriert sind (0, 1, 2, 3) ist das Finden des x-ten Schlüssels trivial. Dieser kann bei einem Array $arr einfach über $arr[$x] abgerufen werden, wobei $x die Position ist (beginnend bei 0).
<?php $arr = array('a', 'b', 'c', 'd', 'e', 'f'); $value = $arr[2]; var_dump($value); ?>
string(1) "c"
Statt über den Index zu gehen kann auch das Sprachkonstrukt list() angewendet werden. Diese liest aus einem Array ein oder mehr Werte aus und weist sie in der selben Zeile bestimmten Variablen zu. Die (gewöhnungsbedürftige) Syntax lautet list($v0, $v1, ...) = $arr, um aus dem Array $arr den ersten, zweiten (und beliebig mehr) Werte auszulesen und direkt den Variablen $v0, $v1 usw. zuzuweisen. Soll nur der Wert an Position x (beginnend bei 0) ausgelesen werden, dann können die vorherigen x-1 Variablen leer gelassen werden. Für Position x=2 etwa: list( , , $v2) = $arr.
<?php $arr = array('a', 'b', 'c', 'd', 'e', 'f'); // Anwendung von list(), ist identisch mit "$zweiter = $arr[1]; $dritter = $arr[2];" list(, $zweiter, $dritter) = $arr; var_dump($zweiter, $dritter); ?>
string(1) "b" string(1) "c"
Voraussetzung für die Anwendung von list() ist, dass das Array von 0 an fortlaufend durchnummeriert ist.
3. Bei fortlaufend durchnummerierten Arrays, nicht beginnend mit 0
Angenommen das Array ist zwar fortlaufend (aufsteigend) durchnummeriert, aber die Schlüssel beginnen nicht bei 0 (zum Beispiel 10, 11, 12), dann ist das Finden des x-ten Schlüssels etwas schwieriger als bei solchen, deren Nummerierung bei 0 beginnt. Das Vorgehen ist hier, dass zunächst das Minimum — also sozusagen der Startpunkt — der Zahlenfolge bestimmt wird. Dieser Wert wird mit min(array_keys($arr)) für das Array $arr berechnet. Die Funktion array_keys($arr) gibt alle Schlüssel des Arrays $arr (wiederum als Array) zurück. min() bestimmt den kleinsten Wert in einem übergebenen Array. Ist das Minimum $min bekannt, so ergibt sich der Schlüssel an Position $x (beginnend bei 0) aus $min+$x.
<?php $arr = array(10 => 'X', 11 => 'XI', 12 => 'XII', 13 => 'XIII', 14 => 'XIV', 15 => 'XV'); $x = 2; $min = min(array_keys($arr)); // hier koennte auch array_flip() statt array_keys() verwendet werden var_dump($arr[$min + $x]); ?>
string(3) "XII"
Statt diesem „Umweg” über das Minimum können hier natürlich auch alle Wege angewendet werden, die nachfolgend für alle Schlüssel ohne numerische Folge vorgestellt werden. Diese sind vermutlich in der Regel schneller, da sie ohne die umständliche Berechnung des Minimums auskommen.
4. Bei nicht durchnummerierten Arrays
Nachfolgend werden mehrere Wege vorgestellt, um bei nicht fortlaufend durchnummerierten Arrays auf das Element an Position x zuzugreifen.
4.1. array_slice()
Mit array_slice($arr, $offset, $length) werden aus dem Array $arr ab Position $offset (beginnend bei 0) $length Elemente extrahiert und als Array zurückgegeben. Die Anwendung dieser Funktion ist einfach und gut lesbar. Einziger Nachteil ist, dass nicht direkt der gesuchte Wert zurückgegeben wird, sondern stattdessen ein Array, welches den Wert als einziges Element enthält. Hier empfiehlt sich die Funktion current($arr), welche vom Array $arr dasjenige Element zurückgibt, auf das der interne Array-Zeiger gerade gerichtet ist. Beim Array, welches von array_slice() zurückgegeben wird, steht dieser immer auf dem ersten (und damit einzigen) Element.
<?php $arr = array('a' => 'a', 'aa' => 'b', 'aaa' => 'c', 'aaaa' => 'd', 'aaaaa' => 'e', 'aaaaaa' => 'f'); // Ohne current() wird ein Array mit einem Element zurückgegeben $value = array_slice($arr, 2, 1); var_dump($value); // Mit current() wird der Wert des Elements zurückgegeben $value = current(array_slice($arr, 2, 1)); var_dump($value); ?>
array(1) { ["aaa"]=> string(1) "c" } string(1) "c"
Hinweis: Ab PHP 5.4 kann man auch einfacher array_slice($arr, 2, 1)[0] statt current(array_slice($arr, 2, 1)) schreiben.
4.2. array_values()
Eine vergleichsweise simple Methode, um auf den x-ten Wert zuzugreifen, ist die Verwendung von array_values($arr). Diese Funktion gibt alle Werte des Arrays $arr zurück — fortlaufend durchnummeriert, beginnend bei 0. Entsprechend kann von da aus wieder direkt auf den x-ten Wert zugegriffen werden, indem x als Schlüssel verwendet wird.
<?php $arr = array('a' => 'a', 'aa' => 'b', 'aaa' => 'c', 'aaaa' => 'd', 'aaaaa' => 'e', 'aaaaaa' => 'f'); $values = array_values($arr); // aus $arr wird array(0=>a, 1=>b, 2=>c, ...) $value = $values[2]; var_dump($value); ?>
string(1) "c"
4.3. array_keys()
Vergleichbar zu array_values($arr) verhält sich array_keys($arr). Diese Funktion gibt nicht alle Werte des Arrays zurück, sondern stattdessen alle Schlüssel. Auch diese sind von 0 an fortlaufend durchnummeriert (0, 1, 2, ...). Dadurch kann leicht auf den x-ten Schlüssel zugegriffen werden, wodurch wiederum der Schlüssel $key des x-ten Elements in $arr bekannt ist und dessen Wert über $arr[$key] abgerufen werden kann. Man geht hier also letztlich einen „Umweg” gegenüber array_values() bei dem zuerst der Schlüssel und erst danach das x-te Element bestimmt wird. Entsprechend ist dieser Weg langsamer und sollte nur dann gegenüber array_values() vorgezogen werden, wenn es dafür einen guten Grund gibt.
<?php $arr = array('a' => 'a', 'aa' => 'b', 'aaa' => 'c', 'aaaa' => 'd', 'aaaaa' => 'e', 'aaaaaa' => 'f'); $keys = array_keys($arr); // aus $arr wird array(0=>"a", 1=>"aa", 2=>"aaa", ...) $keyOfValue = $keys[2]; $value = $arr[$keyOfValue]; var_dump($value); ?>
string(1) "c"
4.4. list()?
Zuvor wurde bereits erwähnt, dass list() nicht auf Arrays angewendet werden kann, deren Schlüssel nicht von 0 an fortlaufend durchnummeriert sind. Das nächste Beispiel zeigt dies noch einmal. Hier wird list() auf ein Array mit String-Schlüsseln angewendet, um das dritte Element zu bestimmen. Dabei entsteht ein „undefined offset”-Notice und list() weist der Variable NULL zu.
<?php $arr = array('a' => 'a', 'aa' => 'b', 'aaa' => 'c', 'aaaa' => 'd', 'aaaaa' => 'e', 'aaaaaa' => 'f'); list(,,$value) = $arr; var_dump($value); ?>
<br /> <b>Notice</b>: Undefined offset: 2 in <b>...\test.php</b> on line <b>3</b><br /> NULL
4.5. foreach-Schleife
Im nächsten Beispiel wird eine foreach-Schleife angewendet. Diese iteriert über alle Werte im Array $arr und prüft dabei, ob der x-te Wert erreicht wurde. Dazu wird parallel zu jeder Iteration eine Zählvariable $x hochgezählt (wird bei jeder Iteration um 1 erhöht). Ist $x identisch mit der gewünschten Position, dann wird die Schleife abgebrochen. Der Wert der letzten Iteration ist in $val gespeichert und bleibt (im Gegensatz zu anderen Programmiersprachen) auch nach Ende der Schleife erhalten. So kann er über var_dump() ausgegeben werden.
<?php $arr = array('a' => 'a', 'aa' => 'b', 'aaa' => 'c', 'aaaa' => 'd', 'aaaaa' => 'e', 'aaaaaa' => 'f'); $x = 0; // Zählvariable, um die aktuelle Iteration und damit Position zu bestimmen foreach ($arr as $val) { if ($x===2) { break; // Schleife beenden, wenn gewünschte Position erreicht wurde } $x++; } // $val aus der Schleife bleibt erhalten. var_dump($val); ?>
string(1) "c"
4.6. for-Schleife mit next() und current()
Vergleichbar zur foreach-Schleife kann hier eine for-Schleife angewendet werden. Diese muss ebenfalls nur über die Elemente iterieren, bis eine Zählvariable den Wert x erreicht (wenn das Element an Position x ausgelesen werden soll). Zusätzlich wird hier die Schleife durch next($arr) ergänzt. Diese Funktion setzt den internen Array-Zeiger auf das nächste Element im Array. Da next() bei jeder Iteration aufgerufen wird, wird auch der Zeiger Stück für Stück der gewünschten Position im Array angenähert, bis diese schließlich erreicht ist. Nach Beendigung der Schleife kann dann der Wert an der aktuellen Position des Array-Zeigers mit current($arr) abgerufen werden. Der Vorteil der for-Schleife gegenüber der foreach-Schleife ist hier, das die for-Schleife als Einzeiler implementiert werden kann.
<?php $arr = array('a' => 'a', 'aa' => 'b', 'aaa' => 'c', 'aaaa' => 'd', 'aaaaa' => 'e', 'aaaaaa' => 'f'); // so lange Array-Zeiger auf das nächste Element verschieben, bis die gewünschte Position erreicht ist for ($x=0; $x<2; $x++, next($arr)); // Element an aktueller Position des Array-Zeigers ausgeben var_dump(current($arr)); ?>
string(1) "c"