PHP, проходящий через половину массива - PullRequest
4 голосов
/ 01 июля 2010

Итак, у меня есть такой массив:

foreach($obj as $element){
//do something
}

Но если массив содержит более 50 элементов (обычно это 100), я хочу просмотреть только первые 50 из них, а затем разорвать цикл.

Ответы [ 9 ]

13 голосов
/ 01 июля 2010

Чистый путь:

$arr50 = array_slice($obj, 0, 50);
foreach($arr50 as $element){
    // $element....
}

Обычный способ (это будет работать только для массивов с числовыми индексами и с порядком asc):

for($i=0; $i<50 && $i<count($obj); $i++){
  $element = $obj[$i];
}

Или, если вы хотите использовать foreach, у вас будет иметь для использования счетчика:

$counter = 0;
foreach($obj as $element){
  if( $counter == 50) break;
  // my eyes!!! this looks bad!
  $counter++;
}
10 голосов
/ 01 июля 2010

Переберите половину.

for($i=0; $i<count($obj)/2; $i++)
{
  $element = $obj[$i];
  // do something
}

или если вы хотите, чтобы первые 50 элементов всегда были

$c = min(count($obj), 50);
for($i=0; $i<$c; $i++)
{
  $element = $obj[$i];
  // do something
}
7 голосов
/ 01 июля 2010

Работает для любого массива, не только для числовых клавиш 0, 1, ...:

$i = 0;
foreach ($obj as $element) {
    // do something
    if (++$i == 50) {
        break;
    }
}
3 голосов
/ 02 июля 2010

Хорошей альтернативой было бы использование пары SPL итераторов , таких как:

$limit = new LimitIterator(new ArrayIterator($obj), 0, 50);
foreach ($limit as $element) {
    // ...
}

Такой же процедурный подход уже упоминался,см. ответы, используя array_slice.

1 голос
/ 02 июля 2010

Проще говоря

$filtered = array_slice($array,0,((count($array)/2) < 50 && count($array) > 50 ? 50 : count($array)));
//IF array/2 is les that 50- while the array is greater then 50 then split the array to 50 else use all the values of the array as there less then 50 so it will not devide
foreach($filtered as $key => $row)
{
  // I beliave in a thing called love.
}

Что здесь происходит

array_slice(
  $array, //Input the whole array
  0, //Start at the first index
  (
    count($array)/2 //and cut it down to half
  )
)
1 голос
/ 01 июля 2010
for ($i = 0, $el = reset($obj); $i < count($obj)/2; $i++, $el = next($obj)) {
    //$el contains the element
}
0 голосов
/ 01 июля 2010

Это должно работать во всех случаях для половины массива независимо от длины и от того, имеет ли он числовые индексы или нет:

$c = intval(count($array)/2);
reset($array);
foreach(range(1, $c) as $num){
    print key($array)." => ".current($array)."\n";
    next($array);
}
0 голосов
/ 01 июля 2010

Вот самый очевидный подход ко мне:

$i = 0;          // Define iterator

while($obj[$i])  // Loop until there are no more
{
 trace($obj[$i]); // Do your action
 $i++;           // Increment iterator
}
0 голосов
/ 01 июля 2010
for($i=0; $i < 50; $i++)
{
  // work on $obj[$i];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...