2010-08-31 6 views
0

vu dans wikipedia, voici ce qui se passe lorsque vous déplacez un iterator via une boucle foreach:accéder à la valeur de la prochaine() et rewind() dans une course iterator PHP dans une boucle foreach

Ces méthodes sont toutes étant utilisées dans une séquence complete foreach ($ object as $ key => $ value). Les méthodes sont exécutées dans l'ordre suivant:

rewind() 
while valid() { 
    current() in $value 
    key() in $key 
    next() 
} 
End of Loop 

Je me demandais comment je peux accéder aux valeurs de la prochaine() et rewind(). Des idées?

MISE À JOUR: les Accès à l'intérieur de la boucle foreach

+3

Pourquoi voudriez-vous y accéder? Cela va jeter le pointeur interne et pourrait potentiellement terminer la boucle prématurément/boucle infinie. Il serait plus logique de les utiliser dans un sens en boucle si c'est à des fins d'apprentissage. –

+0

Dans la bibliothèque DB que j'utilise, j'ai l'intention d'accéder à la ligne précédente et à l'élément de ligne suivant de la requête. Y a-t-il une meilleure manière de faire cela? – yretuta

+0

Probablement. Quelle est la bibliothèque DB? Ou voulez-vous dire que vous créez le vôtre? – prodigitalson

Répondre

1

Vous ne pouvez pas. Pour déclencher un reset, vous devez entrer à nouveau dans la boucle, et pour appeler le next, vous devez passer à l'itération suivante.

donc le plus proche (PHP 5.3) serait:

label: 
foreach ($var as $k => $v) { 

    /* ... */ 
    goto label; //re-enter loop 

    /* ... */ 
    continue; //force going to the next iteration 

    /* ... */ 
} 

Si vous utilisez itérateurs, vous pouvez utiliser ces appels:

$r = 0; $s = 0; 
$it = new ArrayIterator(array("a" => 3, "b" => 5, "c" => 7)); 
foreach ($it as $k => $v) { 
    echo "$k => $v\n"; 
    if ($s == 0) { 
     $s = 1; 
     $it->next(); //jump over one iteration 
    } else if ($r == 0) { 
     $r = 1; 
     $it->rewind(); 
    } 
} 

donne:

 
a => 3 
c => 7 
b => 5 
c => 7 
0

si sa mise en œuvre de la méthode ceux Iterator l'interface, vous pouvez appeler vous-même, mais ils ont des implications. Tous les deux définissent la position du pointeur dans l'ensemble de données qui est itéré sur ... ils ne retournent pas réellement l'élément ou l'index. Donc appeler l'un ou l'autre va bousiller votre boucle.

current retournera la même variable que vous avez déjà dans la boucle - ie. l'élément pour l'itération en cours. key retournera l'index pour cet article dans l'ensemble.

2

Qu'en pensez-vous?

for ($i =0; $i < count($arr); $i++) { 

    $last = ($i == 0) ? null : $arr[$i-1]; 
    $next = (isset($arr[$i+1]) ? $arr[$i+1] : null; 
    $current = $arr[$i]; 

    //... 

} 
+1

Ne fonctionne pas en général (les clés peuvent ne pas être des entiers, ou ne pas commencer par 0 et être séquentielles). – Artefacto

Questions connexes