PHP: как перебрать массив и продолжить с того места, где вы остановились? - PullRequest
0 голосов
/ 20 декабря 2009

Вот мой массив:

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

Я хочу перебрать массив 5 раз, сделать что-то еще, а затем возобновить итерацию с того места, где я остановился.

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

//do something else now

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

Как я могу это сделать? Есть ли способ достичь этого с помощью цикла foreach?

Обновление: Я понял, что было бы глупо повторять один и тот же код дважды. Причина, по которой я спрашивал об этом, заключается в том, что я использую цикл foreach для отображения строк таблицы. Я хотел показать первые пять, а остальные спрятать. Вот что я закончил:

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

3 голосов
/ 20 декабря 2009

Вам нужно использовать внутренний указатель массива PHP.

Что-то вроде:

$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
1 голос
/ 20 декабря 2009

Используйте два массива:

$first_five = array_slice($array, 0, 5);
$remainder = array_slice($array, 5);
1 голос
/ 20 декабря 2009

как то так:

$counter = 0;
foreach ($array as $value) 
{
if($counter == 5)
{
   do something random;
   $counter++;
   continue;
}
    //do something until key 5
$counter++;
}
1 голос
/ 20 декабря 2009

Просто любопытно, но не вызовет ли функция в массиве, чтобы сделать то, что вам нужно, достигнет того же результата?

0 голосов
/ 20 декабря 2009

(Для указанной проблемы я бы не советовал, но :) Вы также можете использовать 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;
}

отпечатков 12345taadaa5678910.
(Обратите внимание на дублирование элемента 5. Раскомментируйте строку $ it-> next (), чтобы избежать этого).

0 голосов
/ 20 декабря 2009

Я думаю, у jspcal был лучший ответ. Единственная модификация, которую я сделал в его коде, заключалась в том, чтобы вместо этого использовать цикл do-while, чтобы он не пропускал элемент, где прерывается первый цикл.

$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 голосов
/ 20 декабря 2009

вы можете использовать каждый () для возобновления итерации.

$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 голосов
/ 20 декабря 2009

Это немного клоодги, но должно работать:

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
}
0 голосов
/ 20 декабря 2009

Есть ли причина, по которой вам нужно сделать это с foreach, а не просто for?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...