2017-02-22 2 views
1

Ich habe folgendes einfaches Array und PHPPHP nächste und vorherige Array-Elemente

$my_array=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"purple","e"=>"yellow"); 


$match_key = array_search("blue",$my_array); 
       echo $match_key; 

Ich mag würde zwei Variablen erstellen, die das Array-Element auf beiden Seiten von $ match_key sind. Also im obigen Beispiel versuche ich am Ende mit ...

$previous = 'green'; 
$next = 'purple'; 

Was ist der beste Weg, um dies anzugehen?

Antwort

1

Wenn Sie keine Möglichkeit haben, Ihre Feldstruktur ändern, könnte man mit nur den Werten des ursprünglichen Arrays die folgenden von „Erstellen“ ein neues Array zu tun, über array_values()

$vals = array_values($my_array); 
$match_key = array_search("blue", $vals); 

echo "PREV: ". $vals [($match_key - 1)] . "\n"; 
echo "CURR: ". $vals[$match_key] ."\n"; 
echo "NEXT: ". $vals [($match_key + 1)] . "\n"; 

Welche zurückgibt:

PREV: green 
CURR: blue 
NEXT: purple 

Jetzt müssen Sie Schlüssel Handhabung tun/etc der Code, um sicherzustellen, keine Fehler werfen und kümmert sich um Ihre Schlüssel auf subtile Weise.


Es gibt verschiedene andere Möglichkeiten (inspired by this post), die in integrierten Funktionen nutzen, obwohl scheinbar länger Prozess unter:

$match_key = array_search("blue", $my_array); 
// loop through and set the array pointer to the $match_key element 
while (key($my_array) !== $match_key) next($my_array); 

$current = $my_array[$match_key]; 
$prev = prev($my_array); 
next($my_array); // set the array pointer to the next elem (as we went back 1 via prev()) 
$next = next($my_array); 

der die bisherigen, aktuellen & nächsten wie unten zurück:

CURRENT: blue 
PREVIOUS: green 
NEXT:  purple 
+0

Ich würde vorschlagen, min und max für die Begrenzung der nächsten und vorherigen Schlüssel und Array_Values, um sicherzustellen, dass das Array immer 0 indiziert ist. – fubar

+0

@Rob Einverstanden, obwohl ich die Antwort auf den Umfang der Frage verlassen habe. Wir werden sehen, worauf er OP zurückkommt – Darren

0

Mit array_values() ist der Weg zu gehen. Dadurch wird ein neues indiziertes Array in der gleichen Reihenfolge wie das ursprüngliche Array erstellt.

Dann können Sie das für Ihren Wert mit array_search() suchen, die den numerischen Index zurückgibt. Dann nur +1 für den nächsten und -1 für den vorherigen.

Natürlich möchten Sie vielleicht überprüfen, ob der Wert, nach dem Sie suchen, tatsächlich existiert. Wenn ja, dann stellen Sie sicher, dass auch index+1 und index-1 vorhanden sind, und setzen Sie sie auf null, wenn dies nicht der Fall ist.

Etwas wie folgt aus:

$my_val = 'blue'; 

$int_indexes = array_values($my_array); // store all values into integer indexed array 

if ($index = array_search($my_val, $int_indexes)) { // don't set prev-next if value not found 
    $prev = array_key_exists($index - 1, $int_indexes) ? $int_indexes[$index - 1] : null; 
    $next = array_key_exists($index + 1, $int_indexes) ? $int_indexes[$index + 1] : null; 
} 

echo "previous: $prev" . '<br>'; 
echo "this: $my_val" . '<br>'; 
echo "next: $next"; 

Gibt Ihnen Ergebnisse:

// previous: green 
// this:  blue 
// next:  purple 

Und wenn Ihr gesuchter Wert am Anfang oder Ende ist, keine Sorgen, Sie nur einen null Wert. Und es wird Ihr gesuchter Wert nicht gefunden, keine Sorge, Sie erhalten nur 2 null Werte.

Verwandte Themen