Bei einem Array $arr ist ein Element an Position $x (Zählung beginnend bei 0) definiert, falls gilt:
- Bei Arrays mit fortlaufend durchnummerierten Schlüsseln, welche bei null beginnen (0, 1, 2, ...): isset($arr[$x])
- Sonst: $x < count($arr)
(Die Methode des zweiten Punkts lässt sich auch auf den ersten anwenden, ist aber geringfügig langsamer.)
1. Fortlaufend durchnummeriert, beginnend bei Null
Bei Arrays mit fortlaufend durchnummerierten Schlüsseln, welche bei Null beginnen (0, 1, 2, ...), ist es sehr einfach, zu überprüfen, ob ein Element an einer bestimmten Position definiert ist. Die Position entspricht dann nämlich dem Schlüssel des Arrays. Entsprechend muss nur nachgeschaut werden, ob ein Element mit dem angegebenen Schlüssel existiert und wenn das der Fall ist, dann existiert das Element an der Position.
1.1. isset()
Das nächste Beispiel zeigt die Verwendung von isset(), um zu prüfen, ob ein bestimmer Schlüssel definiert ist. Die Syntax ist einfach und lautet schlicht isset($array[schluessel]), wobei „schluessel” der Schlüssel ist, auf den geprüft werden soll.
<?php $arr = array('a', 'b', 'c', 'd', 'e'); var_dump(isset($arr[0])); var_dump(isset($arr[2])); var_dump(isset($arr[8])); ?>
bool(true) bool(true) bool(false)
1.2. array_key_exists()
Alternativ zu isset() kann auch array_key_exists($schluessel, $array) verwendet werden, um zu ermitteln, ob der Schlüssel $schluessel im Array $array definiert ist. Im Gegensatz zu isset() gibt array_key_exists() auch dann true zurück, wenn dem Schlüssel der Wert NULL zugeordnet ist. Dafür ist die Performance etwas schlechter, da erst einmal eine Funktion aufgerufen werden muss.
<?php $arr = array('a', 'b', 'c', 'd', 'e'); var_dump(array_key_exists(0, $arr)); var_dump(array_key_exists(2, $arr)); var_dump(array_key_exists(8, $arr)); ?>
bool(true) bool(true) bool(false)
2. Nicht fortlaufend durchnummeriert
Ist das Array nicht fortlaufend durchnummeriert (oder die Nummerierung beginnt nicht bei 0), dann ist es nur minimal schwieriger herauszufinden, ob ein Element an einer bestimmten Position definiert ist. Nachfolgend werden mehrere mögliche Wege vorgestellt, von denen das Zählen der Elemente im Array wohl der einfachste ist. Dieser wird im nächsten Abschnitt erläutert.
2.1. count()
Damit das x-te Element eines Arrays definiert sein kann, muss das Array mindestens x-1 Elemente enthalten (minus 1, da x hier bei 0 beginnt). Wie viele Elemente ein Array $arr enthält wird mit count($arr) bestimmt. Das nächste Beispiel demonstriert die Anwendung, indem es die gewünschten Positionen 0, 2 und 8 mit dem count-Wert des Arrays (5) vergleicht.
<?php $arr = array('I' => 'a', 'II' => 'b', 'III' => 'c', 'IV' => 'd', 'V' => 'e'); var_dump(0 < count($arr)); var_dump(2 < count($arr)); var_dump(8 < count($arr)); ?>
bool(true) bool(true) bool(false)
2.2. array_keys()/array_values() und isset()
Um auch bei nicht fortlaufend durchnummerierten Arrays isset() verwenden zu können, kann zuvor array_values($array) oder alternativ array_keys($array) angewendet werden. array_values($array) gibt alle Werte des Arrays als Array zurück, wobei neue Schlüssel gebildet werden, welche bei 0 beginnen und fortlaufend sind (0, 1, 2, ...). array_keys($array) gibt analog alle Schlüssel als neues Array zurück (die ehemaligen Schlüssel sind dann die Werte des neuen Arrays). Entsprechend kann isset() auf die neu berechneten Arrays angewendet werden, so wie in den Beispielen weiter oben zu fortlaufend durchnummerierten Arrays beschrieben (da die neuen Arrays fortlaufend durchnummeriert sind).
array_keys() in Kombination mit isset():
<?php $arr = array('I' => 'a', 'II' => 'b', 'III' => 'c', 'IV' => 'd', 'V' => 'e'); $keys = array_keys($arr); var_dump(isset($keys[0])); var_dump(isset($keys[2])); var_dump(isset($keys[8])); ?>
bool(true) bool(true) bool(false)
array_values() in Kombination mit isset():
<?php $arr = array('I' => 'a', 'II' => 'b', 'III' => 'c', 'IV' => 'd', 'V' => 'e'); $values = array_values($arr); var_dump(isset($values[0])); var_dump(isset($values[2])); var_dump(isset($values[8])); ?>
bool(true) bool(true) bool(false)
2.3. array_keys()/array_values() und array_key_exists()
Zuvor wurde bereits beschrieben, wie durch array_keys() und array_values() jeweils Arrays erzeugt werden können, auf die die Anwendung von isset() möglich ist, um zu bestimmen, ob ein Element an einer bestimmten Position definiert ist. Das funktioniert natürlich auch genauso in Kombination mit array_key_exists($schluessel, $array) statt isset().
array_keys() in Kombination mit array_key_exists():
<?php $arr = array('I' => 'a', 'II' => 'b', 'III' => 'c', 'IV' => 'd', 'V' => 'e'); $keys = array_keys($arr); var_dump(array_key_exists(0, $keys)); var_dump(array_key_exists(2, $keys)); var_dump(array_key_exists(8, $keys)); ?>
bool(true) bool(true) bool(false)
array_values() in Kombination mit array_key_exists():
<?php $arr = array('I' => 'a', 'II' => 'b', 'III' => 'c', 'IV' => 'd', 'V' => 'e'); $values = array_values($arr); var_dump(array_key_exists(0, $values)); var_dump(array_key_exists(2, $values)); var_dump(array_key_exists(8, $values)); ?>
bool(true) bool(true) bool(false)
2.4. array_slice() und key()
Mit der Funktion array_slice($arr, $offset, 1) lässt sich das Element an Position $offset aus $arr extrahieren. Die Rückgabe ist ein Array. Falls das Element nicht existiert, ist dieses Array entsprechend leer. Durch einmalige Anwendung von key($arr) auf die Rückgabe lässt sich herausfinden, ob es ein Element enthält oder nicht. Falls nicht, ist das Ergebnis von key($arr) NULL.
<?php $arr = array('I' => 'a', 'II' => 'b', 'III' => 'c', 'IV' => 'd', 'V' => 'e'); var_dump(key(array_slice($arr, 0, 1))); // "I" var_dump(key(array_slice($arr, 2, 1))); // "III" var_dump(key(array_slice($arr, 8, 1))); // NULL, die Rückgabe von array_slice() ist also leer // und das Element an Position 8 existiert nicht ?>
string(1) "I" string(3) "III" NULL
2.5. for-Schleife mit current() und next()
Im nächsten Beispiel wird eine for-Schleife definiert, um zu bestimmen, ob das x-te Element definiert ist. Die Schleife iteriert über alle Elemente im Array. Während jeder Iteration wird eine Zählvariable $x hochgezählt und über next($arr) wird der interne Array-Zeiger auf das nächste Element im Array verschoben. Hat nun $x einen Wert nachdem gesucht werden soll, dann wird im Array $found hinterlegt, dass das Element an der Position gefunden wurde.
<?php $arr = array('I' => 'a', 'II' => 'b', 'III' => 'c', 'IV' => 'd', 'V' => 'e'); $found = array(0=>false, 2=>false, 8=>false); reset($arr); // Über next($arr) wird der interne Array-Zeiger nach jeder Iteration eins vorgerückt // Über current($arr)!==false wird geprüft, ob das Ende erreicht wurde. Die Funktion gibt false zurück, falls das // der Fall ist. Entsprechend gibt es Probleme mit Arrays, die false als Wert enthalten können. // Auch möglich wäre hier $x<count($arr) (wobei das Ergebnis von count($arr) zwischengespeichert werden sollte). for ($x=0; current($arr)!==false; next($arr), $x++) { // soll nach der Position gesucht werden? if (isset($found[$x])) { // Falls ja, dann wird diese als gefunden markiert $found[$x] = true; } } var_dump($found); ?>
array(3) { [0]=> bool(true) [2]=> bool(true) [8]=> bool(false) }
2.6. Bei mehrdimensionalem Array: array_walk_recursive()
Um zu bestimmen, ob das x-te Element in einem mehrdimensionalen Array definiert ist, kann array_walk_recursive($array, $callback) zu Hilfe genommen werden. Diese Funktion iteriert über sämtliche Elemente im mehrdimensionalen Array (also einschließlich der Unterelemente) und wendet auf alle die Callback-Funktion $callback an. Lässt man in diese Callback-Funktion nun eine Zählvariable mitlaufen, ist das weitere Vorgehen im Grunde identisch zur for-Schleife. Es wird also wieder bei jeder Anwendung der Funktion geprüft, ob die Zählvariable einem Wert für eine Position entspricht, nach der gesucht wird und dies gegebenenfalls in $found vermerkt.
<?php $arr = array('I' => 'a', array('II' => 'b', 'III' => 'c'), array('IV' => 'd'), 'V' => 'e'); $found = array(0=>false, 2=>false, 8=>false); $x = 0; array_walk_recursive($arr, function() use (&$x, &$found) { if (isset($found[$x])) { $found[$x] = true; } $x++; }); var_dump($found); ?>
array(3) { [0]=> bool(true) [2]=> bool(true) [8]=> bool(false) }