web-dev-qa-db-fra.com

PHP tableau obtenir la clé/valeur suivante dans foreach ()

Je cherche un moyen d'obtenir le prochain et prochain + 1 paire clé/valeur dans un foreach () Par exemple:

$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
    }

}
11
danielb

Vous ne pouvez pas accéder de cette façon aux valeurs suivante et suivante.

Mais vous pouvez faire quelque chose de similaire:

$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
    }
}
10
Lajos Veres

J'ai trouvé la solution avec la complexité O(n) et ne nécessite pas de chercher dans un tableau:

$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();
}

Rappelez-vous simplement de tester valid() si vous prévoyez de relayer sur le $next_val et le $next_next_val.

2
Maciej Sz

Voici une façon de le faire:

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
}

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

Notez que la boucle écrite de cette façon n'examinera jamais le dernier élément de votre tableau d'origine. Cela pourrait être corrigé, bien qu'avec votre logique actuelle, cela ne semble pas avoir d'importance puisqu'il n'y a pas "plus" d'éléments avec lesquels comparer le dernier.

1
jszobody

Jetez un coup d’œil à CachingIterator, comme décrit dans cette réponse:

Coup d'oeil en avant lors de l'itération d'un tableau dans PHP

Ou utilisez array_keys () dans une autre réponse postée pour la même question, par exemple.

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

Vous ne pouvez pas simplement "rester en place" dans une boucle. Je suppose que vous cherchez à faire quelque chose de beaucoup plus facile que d’écrire des itérateurs personnalisés. Si vous souhaitez simplement ignorer les entrées contenant des clés en double, suivez la dernière clé et comparez-la à la clé actuelle.

$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;
}
0
Dave