ограничение количества запусков цикла в php

У меня есть цикл foreach, который мне нужно ограничить первыми 10 элементами, а затем вырваться из него.

Как бы я сделать это здесь?

foreach ($butters->users->user as $user) {
    $id = $user->id;
    $name = $user->screen_name;
    $profimg = $user->profile_image_url;
    echo "things";    
} 

был бы признателен за подробное объяснение.

7 ответов


Если вы хотите использовать foreach, вы можете добавить дополнительную переменную для контроля количества итераций. Например:

$i=0;
foreach ($butters->users->user as $user) {
    if($i==10) break;
    $id = $user->id;
    $name = $user->screen_name;
    $profimg = $user->profile_image_url;
    echo "things";  
    $i++;  
} 

вы также можете использовать LimitIterator.

например

$users = new ArrayIterator(range(1, 100)); // 100 test records
foreach(new LimitIterator($users, 0, 10) as $u) {
  echo $u, "\n";
}

вы можете просто перебрать array_slice($butters->users->user, 0, 10) (первые 10 элементов).


используйте счетчик циклов и break когда вы хотите выйти.

$i = 0;
foreach ($butters->users->user as $user) {
  $id = $user->id;
  $name = $user->screen_name;
  $profimg = $user->profile_image_url;
  echo "things";    
  if (++$i >= 10) {
    break;
  }
} 

на 10-й итерации цикл завершится в конце.

есть несколько вариантов этого, и одна вещь, которую вам нужно выбрать, - хотите ли вы выполнить условие внешнего цикла или нет. Подумайте:

foreach (read_from_db() as $row) {
  ...  
}

Если вы выйдете в верхней части этого цикла, вы прочитаете 11 строк. Если вы выйдете снизу, будет 10. В обоих случаях тело цикла выполняется 10 раз, но выполнение этой дополнительной функции может быть тем, что вы хотите, или нет.


если вы уверены, что хотите сохранить foreach цикл, добавьте счетчик:

$count = 0;
foreach ($butters->users->user as $user) {
    $id = $user->id;
    $name = $user->screen_name;
    $profimg = $user->profile_image_url;
    echo "things";    

    $count++;
    if ($count == 10)
      break;
}

таким образом, каждый раз, когда ваш цикл выполняется, счетчик увеличивается, и когда он достигает 10, цикл прерывается.

в качестве альтернативы вы можете переработать foreach петли для for петли, если это возможно.


вы можете запустить счетчик перед блоком foreach и проверить его в цикле и сломать, если счетчик равен 10, как так,

$count = 1;
foreach ($butters->users->user as $user) {
    if($count == 10)
       break;
    $id = $user->id;
    $name = $user->screen_name;
    $profimg = $user->profile_image_url;
    echo "things";
    $count++;
} 

Мне очень нравится ответ VolkerK, но я не понимаю, почему он создает новый итератор, когда, скорее всего, у вас будет существующий массив. Просто хочу поделиться тем, как все закончилось.

$arrayobject = new ArrayObject($existingArray);
$iterator = $arrayobject->getIterator();

foreach(new LimitIterator($iterator, 0, 10) as $key => $value) {
   // do something
}