1. Wenn das Array fortlaufend durchnummeriert ist (0, 1, 2, 3...)
Ist das Array fortlaufend durchnummeriert (0, 1, 2, 3, ...), dann ist das Suchen nach einem Schlüssel, der auf einen bestimmten anderen folgt offensichtlich trivial, da er sich aus gesuchter Schlüssel + 1 ergibt. Das nächste Beispiel demonstriert dies kurz. In diesem wird zunächst ein Array mit den ersten fünf römischen Ziffern definiert. Gesucht werden soll der Schlüssel, der auf 2 (Schlüssel von III, da die Zählung bei 0 beginnt) folgt. Dieser ergibt sich aus 2+1, also 3. Einzige potentielle Fehlerquelle hier ist es, vor dem Auslesen des berechneten Schlüssel nicht zu prüfen, ob dieser überhaupt existiert — dann könnten hässliche Warnungen entstehen (nicht in diesem speziellen Beispiel, aber das ganze soll möglichst veralpgemeinerbar sein).
<?php $arr = array('I', 'II', 'III', 'IV', 'V'); $searchedKey = 2; if ($searchedKey+1 < count($arr)) { var_dump($searchedKey + 1); var_dump($arr[$searchedKey + 1]); } else { var_dump(null, null); } ?>
int(3) string(2) "IV"
2. Wenn das Array nicht fortlaufend durchnummeriert und die Schlüsselposition unbekannt ist
Ist das Array nicht fortlaufend durchnummeriert, dann ist das Finden eines Folgeschlüssels schon etwas schwieriger. Zunächst müssen die Schlüssel des Arrays ausgelesen werden, wozu array_keys($arr) angewendet wird, was alle Schlüssel des Arrays $arr wiederum als Array zurückgibt (die Schlüssel von $arr sind also die Werte des Rückgabearrays). Innerhalb dieses Arrays kann nun nach dem Bezugsschlüssel mit array_search($value, $array, true) gesucht werden ($value=Bezugsschlüssel, $array=Rückgabearray von array_keys()). Ist der Schlüssel gefunden, dann ist auch seine Position $pos bekannt, denn diese wird von array_search() zurückgegeben. An der Position $pos+1 im Rückgabearray von array_keys() steht nun der Schlüssel, der auf den Bezugsschlüssel im ursprünglichen Array folgt.
<?php $arr = array('I' => 1, 'II' => 2, 'III' => 3, 'IV' => 4, 'V' => 5); $searchedKey = 'III'; // Bezugsschlüssel (der Schlüssel nach diesem soll gefunden werden) $keys = array_keys($arr); // alle Schlüssel aus $arr als Array $pos = array_search($searchedKey, $keys, true); // Position des Bezugsschlüssels suchen $nextKey = ($pos < count($keys)-1 ? $keys[$pos+1] : null); // Falls Bezugsschlüssel gefunden wurde, den nächsten Schlüssel ermitteln (Position+1) var_dump($nextKey); ?>
string(2) "IV"
Als Alternative zur Kombination aus array_keys() und array_search() kann auch eine einfache foreach-Schleife verwendet werden. Diese iteriert über alle Werte und prüft bei jeder Iteration, ob der aktuelle Schlüssel mit dem Bezugsschlüssel identisch ist. Falls ja, wird die Variable $found auf true gesetzt. Noch vor jedem anderen Vorgang wird bei allen Iteration geprüft, ob diese Variable bereits auf true gestellt wurde und gegebenenfalls der aktuelle Schlüssel ausgegeben (sowie die Schleife abgebrochen). Dadurch wird letztlich derjenige Schlüssel, der auf den gesuchten Bezugsschlüssel folgt, ausgegeben. (Das ist der Sinn hinter $found: Nicht der Bezugsschlüssel, sondern der nächste Schlüssel soll ausgegeben werden. Also muss zwischengespeichert werden, ob bei der letzten Iteration dieser Bezugsschlüssel gefunden wurde.)
<?php $arr = array('I' => 1, 'II' => 2, 'III' => 3, 'IV' => 4, 'V' => 5); $searchedKey = 'III'; $found = false; foreach ($arr as $key=>$val) { // Prüfen, ob bei der _vorherigen_ Iteration der Bezugsschlüssel gefunden wurde if ($found) { var_dump($key); break; } else { if ($key === $searchedKey) { $found = true; } } } ?>
string(2) "IV"
3. Wenn das Array nicht fortlaufend durchnummeriert, aber die Schlüsselposition bekannt ist
Wenn die Position des Bezugsschlüssels bekannt ist, kann man sich das umständliche Suchen nach diesem sparen. Entsprechend ist es nur noch notwendig, das Array aller Schlüssel über array_keys() zu bilden und den Schlüssel an der Position des Bezugsschlüssels plus eins auszulesen.
<?php $arr = array('I' => 1, 'II' => 2, 'III' => 3, 'IV' => 4, 'V' => 5); $keyPosition = 2; $keys = array_keys($arr); if ($keyPosition+1 < count($arr)) { var_dump($keys[$keyPosition + 1]); var_dump($arr[$keys[$keyPosition + 1]]); } else { var_dump(null, null); } ?>
string(2) "IV" int(4)