PHP: nasıl bir dizi yineleme ve kaldığınız yerden devam etmek?

9 Cevap php

İşte benim dizi var:

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

Ben bıraktığı yineleme devam sonra, başka bir şey yapmak, dizi boyunca 5 kez yinelemek istiyorum.

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

//do something else now

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

Bunu nasıl yapabilirim? Bir foreach döngüsü ile bunu başarmak için bir yolu var mı?

Update: Ben iki kez aynı kodu tekrarlamak saçma olacağını fark etti. Ben tablo satırları görüntülemek için bir foreach döngü kullanıyorum çünkü ben bu soruyordum nedenidir. Ben ilk beş görüntülemek ve kalan gizlemek istedi. Yani bu ben ile sona budur:

<?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; ?>

9 Cevap

böyle bir şey:

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

PHP'nin dahili dizi işaretçi kullanmak gerekir.

Gibi bir şey:

$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

Sadece merak, ama bitti aynı sonucu elde gerekenleri yapmak için dizideki bir işlev çağırarak değil mi?

Sadece for karşıt olarak, foreach ile bu yapmanız gereken bir nedeni var mı?

Eğer iterating devam etmek için () her kullanabilirsiniz.

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

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

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

Iki dizileri kullanın:

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

Ben jspcal şimdiye kadar en iyi cevabı olduğunu düşünüyorum. Ben onun kodu için yapılan tek değişiklik yerine bir do-while döngüsü kullanmak olduğunu, bu yüzden eleman ilk döngü sonları atlamak olmaz.

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

(Belirtildiği gibi problem için ben de NoRewindIterator kullanabilirsiniz :) bunu tavsiye etmem ama.

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

prints 12345taadaa5678910.
(Note the duplication of the element 5. Uncomment the $it->next() line to avoid that).

Biraz kloodgy, ama çalışması gerekir:

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
}