Я ищу правильную логику для циклического прохождения набора записей и запуска события каждый n раз.
Поиск в Google Я нашел некоторое обсуждение подобных ситуаций, но кажется, что решения неt соответствует моим потребностям.
Мне нужно связать мое приложение с веб-сервисом, который использует minOccurs = "0" maxOccurs = "4" для повторяемых элементов в одном вызове.Допустим, у меня есть набор записей из 22 строк.
Мне нужно:
- пройти через набор записей и заполнить массив $ data каждой строкой
- в 4-й строке (8-й, 12-й, 16-й ...) запустить событие (вызвать WS с $ data из 4 элементов)
- empty $ data и продолжить цикл до следующего 4-го
- , если число строк не кратно 4я должен обработать остаток и запустить один последний вызов
Используя оператор модуля, как показано в этом ответе , if($i % 4 == 0)
, я получаю событие, инициируемое каждые 4 строки, но 22это не кратно 4, поэтому событие запускается до 20-го ряда, а затем ничего.Может быть, мне нужно сделать деление подсчета строк в «избытке»?
Так как набор записей будет между 50 и 200 строками, я думаю, что нет необходимости запускать множественный запрос из 4 строк, я не прав?
Заранее спасибо!
ОБНОВЛЕНИЕ: Вдохновленный ответами ниже, мне наконец-то удалось заставить скрипт работать так, как я хотел ... возможно, это не изящное решение, но работает как ожидалось:
$result = $query->result(); // the recordset
$total_rows = count($result);
$interleave = 4;
$reminder = $total_rows % $interleave;
$round_rows = ($total_rows-$reminder)+1; // +1 because $i dont start at zero
$data = array();
Начните с начального цикла ($ round_rows кратен 4)
for ($i=1; $i<$round_rows; $i++){
$data[$i] = $result[$i];
if ($i % $interleave == 0){
$this->fire_event($data);
$data = array();
}
}
Затем, если есть напоминание, цикл через ...
if ($total_rows % $interleave !== 0){
for ($i = $round_rows; $i < $total_rows + 1; $i++) {
$data[$i] = $result[$i];
}
$this->fire_event($data);
}
Любой совет приветствуется!