La matrix PHP ottiene la prossima chiave / valore in foreach ()

Sto cercando un modo per get il prossimo e il successivo + 1 coppia chiave / valore in un foreach (). Per esempio:

$a = arrays('leg1'=>'LA', 'leg2'=>'NY', 'leg3'=>'NY', 'leg4'=>'FL'); foreach($a AS $k => $v){ if($nextval == $v && $nextnextval == $v){ //staying put for next two legs } } 

Non è ansible accedere in questo modo ai valori successivo e successivo.

Ma puoi fare qualcosa di simile:

 $a = arrays('leg1'=>'LA', 'leg2'=>'NY', 'leg3'=>'NY', 'leg4'=>'FL'); $keys = arrays_keys($a); foreach(arrays_keys($keys) AS $k ){ $this_value = $a[$keys[$k]]; $nextval = $a[$keys[$k+1]]; $nextnextval = $a[$keys[$k+2]]; if($nextval == $this_value && $nextnextval == $this_value){ //staying put for next two legs } } 

Ecco un modo per farlo:

 while($current = current($a)) { $next = next($a); $nextnext = next($a); // Comparison logic here prev($a); // Because we moved the pointer ahead twice, lets back it up once } 

Esempio: http://3v4l.org/IGCXW

Nota che il ciclo scritto in questo modo non esaminerà mai l'ultimo elemento dell'arrays originale. Questo potrebbe essere risolto, anche se con la tua logica attuale non sembra avere importnza dal momento che non ci sono "più" elementi per confrontare l'ultimo a.

Ho trovato la soluzione con complessità O(n) e non richiede la ricerca attraverso l'arrays avanti e indietro:

 $a = arrays('leg1'=>'LA', 'leg2'=>'NY', 'leg3'=>'NY', 'leg4'=>'FL'); // initiate the iterator for "next_val": $nextIterator = new ArrayIterator($a); $nextIterator->rewind(); $nextIterator->next(); // put the initial pointer to 2nd position // initiaite another iterator for "next_next_val": $nextNextIterator = new ArrayIterator($a); $nextNextIterator->rewind(); $nextNextIterator->next(); $nextNextIterator->next(); // put the initial pointer to 3rd position foreach($a AS $k => $v){ $next_val = $nextIterator->current(); $next_next_val = $nextNextIterator->current(); echo "Current: $v; next: $next_val; next_next: $next_next_val" . PHP_EOL; $nextIterator->next(); $nextNextIterator->next(); } 

Ricordati di testare valid() se $next_val il relay su $next_val e $next_next_val .

Dai un'occhiata a CachingIterator, come descritto in questa risposta:

Sbircia in anticipo quando iterazione di un arrays in PHP

Oppure usa arrays_keys () è in un'altra risposta postata per la stessa domanda, es

 $keys = arrays_keys($arrays); for ($i = 0; $i < count($keys); $i++) { $cur = $arrays[$keys[$i]]; $next = $arrays[$keys[$i+1]]; } 

Non puoi semplicemente "stare fermi" in un ciclo. Sospetto che tu stia cercando di fare qualcosa di molto più semplice di scrivere iteratori personalizzati. Se si desidera semplicemente ignorare le voci con chiavi duplicate, quindi tenere traccia dell'ultima chiave e confrontarla con quella corrente.

 $a = arrays('leg1'=>'LA', 'leg2'=>'NY', 'leg3'=>'NY', 'leg4'=>'FL'); // Prints LA NY FL $last_v = null; foreach ( $a as $k => $v ){ if ( $last_v == $v ) { /** * Duplicate value, so skip it */ continue; } echo $v.' '; $last_v = $v; } 

Divertente, sto programmando PHP per un decennio (con pausa di anni), ma avevo bisogno di una function di walk one-by-one solo una settimana fa.

Eccoti: next , prev, reset ecc. Vedi la sezione "vedi anche". Inoltre, controlla arrays_keys ()