2013-12-09 14 views
11

Sto cercando un modo per ottenere il prossimo e il successivo + 1 coppia chiave/valore in un foreach(). Ad esempio:L'array PHP ottiene la chiave/il valore successivo in foreach()

$a = array('leg1'=>'LA', 'leg2'=>'NY', 'leg3'=>'NY', 'leg4'=>'FL'); 

foreach($a AS $k => $v){ 

    if($nextval == $v && $nextnextval == $v){ 
     //staying put for next two legs 
    } 

} 
+0

Ecco una soluzione che potrebbe funzionare: http://stackoverflow.com/a/5096852/1022697 – qwertynl

+0

vorrei creare un iteratore personalizzato per questo. –

risposta

8

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

Ma si può fare qualcosa di simile:

$a = array('leg1'=>'LA', 'leg2'=>'NY', 'leg3'=>'NY', 'leg4'=>'FL'); 

$keys = array_keys($a); 
foreach(array_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 
    } 
} 
+0

Ho finito per usare questo anche se non ha risposto alla mia domanda 100% – danielb

-2

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

Qui ci sono: next, anteprima, reset ecc. Vedere la sezione "vedi anche". Inoltre, controllare array_keys()

0

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

Peek ahead when iterating an array in PHP

Oppure utilizzare array_keys() è in un'altra risposta pubblicato per la stessa domanda, per esempio

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

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 sarà mai esaminerà l'ultimo elemento nella propria matrice originale. Questo potrebbe essere risolto, anche se con la tua logica attuale non sembra avere importanza dal momento che non ci sono "più" elementi per confrontare l'ultimo a.

1

ho trovato la soluzione con la complessità O(n) e non richiede che cercano attraverso la gamma avanti e indietro:

$a = array('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(); 
} 

Basta ricordare per verificare valid() se si prevede di trasmettere sulla $next_val e $next_next_val.

0

Non si può 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 = array('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; 
} 
Problemi correlati