Модуль внутри цикла

У меня есть массив, который я просматриваю и разбиваю на куски по 50. Однако иногда количество элементов внутри этого массива больше, чем то, что помещается внутри этого куска из 50, например:

$array = array(); // has 220 rows

for ($i = 0; $i < count($array); $i++) { 
    $j[] = $i;

    if ($i % 50 == 1) {
        print_r($j); // do something here with the 50 rows
        $j = null;
    }
}

Проблема здесь в том, что это ничего не напечатает после 201. Я знаю, что для решения этого вопроса требуется некоторая алгебраическая математика, но я ничего не понимаю. В такие времена мне действительно жаль, что я не обращал внимания на уроки математики в старшей школе.


person Meisam Mulla    schedule 02.07.2013    source источник
comment
Каков ваш желаемый результат или результирующий массив?   -  person Rikesh    schedule 02.07.2013
comment
Я думаю, это потому, что он останавливается, когда счет равен 50. Таким образом, после 200 он не может достичь более 50 строк, поэтому он останавливается на 201.   -  person Matheno    schedule 02.07.2013
comment
никогда не ставьте счет, внутри for() вы запускаете функцию n раз вместо одного   -  person    schedule 02.07.2013
comment
По сути, я хочу выполнить пакетный запрос к API-интерфейсу Facebook Graph, и за раз требуется не более 50 запросов.   -  person Meisam Mulla    schedule 02.07.2013


Ответы (5)


Я думаю, что array_chunk соответствует вашим требованиям и не требует математики.

$result_array = array_chunk($array, 50, true);
person Rikesh    schedule 02.07.2013

Добавить дополнительное условие

if ($i % 50 == 1 || count($array)-1 == $i)
person sectus    schedule 02.07.2013
comment
Как это будет работать? По моей логике count($j) никогда не достигнет максимума 50. - person Meisam Mulla; 02.07.2013
comment
Ты чертовски шутишь. Как я об этом не подумал! - person Meisam Mulla; 02.07.2013
comment
но вы должны использовать ответ @Rikesh. - person sectus; 02.07.2013
comment
@MeisamMulla, рад за вас, что вы решили использовать лучшие практики - person sectus; 04.07.2013

Вам просто нужно повторно объявить массив, я думаю:

$array = array(); // has 220 rows

for ($i = 0; $i < count($array); $i++) { 
    $j[] = $i;

    if ($i % 50 == 1) {
        print_r($j); // do something here with the 50 rows
        $j = array() ;
    }
}

После того, как вы выполните $j = null, вы не сможете сделать $j[] = $i

person vikingmaster    schedule 02.07.2013
comment
Это не проблема. Я получаю другой массив, как и ожидалось, при использовании $j = null. - person Meisam Mulla; 02.07.2013

$array = array(); // has 220 rows

for ($i = 0; $i < count($array); $i++) {
    $j[] = $i;

    if ($i % 50 == 1) {
        doSomething($j); // do something here with the 50 rows
        $j = array(); // reset the array
    }
}
doSomething($j); // with the last 20 entries

После завершения цикла у вас будут оставшиеся от 201 до 220 записей в $j, так что просто повторите свои действия.

person Vlad Preda    schedule 02.07.2013

array_chunk может оказаться полезным. В основном разбивает массив на куски, возвращая многомерный массив

person David Jones    schedule 02.07.2013