2009-12-20 4 views
0

Voici mon tableau:PHP: comment parcourir à travers un tableau, et reprendre là où vous l'avez laissé?

$array = array(1,2,3,4,5,6,7,8,9,10); 

Je veux parcourir le tableau 5 fois, faire quelque chose d'autre, puis reprendre l'itération où je me suis arrêté.

foreach ($array as $value) { 
    //do something until key 5 
} 

//do something else now 

//resume... 
foreach ($array as $value) { 
    //key should start at 6 
} 

Comment est-ce que je peux faire ceci? Y a-t-il un moyen d'y parvenir avec une boucle foreach?

Mise à jour: Je me suis rendu compte qu'il serait bête de répéter deux fois le même code. La raison pour laquelle je posais cette question est parce que j'utilise une boucle foreach pour afficher les lignes de la table. Je voulais afficher les cinq premiers et cacher le reste. Voilà donc ce que j'ai fini avec: Par curiosité,

<?php 
$counter = 1; 
foreach ($array as $object): ?> 

    <?php if ($counter > 5): ?> 
     <tr style="display: none;"> 
    <?php else: ?> 
     <tr> 
    <?php endif; ?> 
      <td><?php echo $object->name; ?></td> 
     </tr> 
    <?php $counter++; ?> 

<?php endforeach; ?> 

Répondre

1

quelque chose comme ceci:

$counter = 0; 
foreach ($array as $value) 
{ 
if($counter == 5) 
{ 
    do something random; 
    $counter++; 
    continue; 
} 
    //do something until key 5 
$counter++; 
} 
1

mais n'appeler une fonction dans le tableau pour faire ce que vous devez faire obtenir le même résultat?

+0

normalement, oui. mais pas dans ce cas, non. – Andrew

0

Y at-il une raison que vous devez faire avec foreach, par opposition à un for?

+0

ma conjecture est qu'il n'est pas concerné par la performance – Woot4Moo

-2

Il est un peu kloodgy, mais il devrait fonctionner:

foreach($array as $key => $value) 
{ 
    $lastkey = $key; 

    // do things 

    if($key == 5) break; 
} 

// do other things 

foreach($array as $key => $value) 
{ 
    if($key <= $lastkey) continue; 

    // do yet more things 
} 
+1

C'est tout à fait l'implémentation unique. – Woot4Moo

0

vous pouvez utiliser each() pour itérer reprendre.

$a = array(1,2,3,4); 

foreach ($a as $v) { 
    if ($v == 2) break; 
} 

while (list($k, $v) = each($a)) { 
    echo "$k = $v\n"; 
} 
+0

La fonction each() renvoie la clé et la valeur de l'élément en cours et déplace le pointeur interne vers l'avant. (Selon l'API sur W3C). Cette déclaration de rupture ne permettrait pas à votre foreach de continuer à s'exécuter, ce qu'il voulait faire. – Woot4Moo

+0

each() reprend à partir de la dernière position du curseur. la question a demandé comment «reprendre» (vous devez probablement arrêter d'itérer - casser - avant de pouvoir reprendre. – jspcal

+0

en le cassant défait le but de cette boucle foreach. Ensuite, il se peut que ce soit juste un petit extrait pour être clair. – Woot4Moo

1

Utilisez deux tableaux:

$first_five = array_slice($array, 0, 5); 
$remainder = array_slice($array, 5); 
+0

J'aime ça le plus. Il ne nécessite pas un if() qui est bouclé à chaque fois, et c'est sympa et soigné. –

3

Vous devez utiliser un pointeur de tableau interne de PHP.

Quelque chose comme:

$arr = range(0, 9); 
for($i = 0; $i < 5; $i++) { 
    print current($arr); 
    next($arr); 
} 

//the pointer should be half way though the array here 
0

Je pense que jspcal avait jusqu'à présent la meilleure réponse. La seule modification que j'ai faite à son code était d'utiliser une boucle do-while à la place, donc il ne sauterait pas l'élément où la première boucle se brise.

$arr = array(1,2,3,4); 

// Prints 1 2 
foreach($arr as $v) 
{ 
    if ($v == 3) 
    { 
     break; 
    } 
    echo "$v "; 
} 

// Prints 3 4 
do 
{ 
    echo "$v "; 
} 
while(list($k, $v) = each($arr)); 
0

(Pour le problème dit que je ne le recommanderais pas, mais :) Vous pouvez également utiliser la NoRewindIterator.

$array = array(1,2,3,4,5,6,7,8,9,10); 
$it = new NoRewindIterator(new ArrayIterator($array)); 

foreach($it as $x) { 
    echo $x; 
    if ($x > 4) { 
    break; 
    } 
} 
// $it->next(); 
echo 'taadaa'; 
foreach($it as $x) { 
    echo $x; 
} 

impressions 12345taadaa5678910.
(Notez la duplication de l'élément 5. Décommentez la ligne $ it-> next() pour éviter cela).