Я ищу правильную логику для циклического прохождения набора записей и запуска события каждые n раз.
Поискав в Google, я нашел обсуждение подобных ситуаций, но кажется, что решения не соответствуют моим потребностям.
Мне нужно связать мое приложение с веб-сервисом, который использует minOccurs="0" maxOccurs="4" для повторяющихся элементов в одном вызове. Допустим, у меня есть набор записей из 22 строк.
Мне необходимо:
- прокручивать набор записей и заполнять массив $data каждой строкой
- в 4-й строке (8-й, 12-й, 16-й...) запустить событие (вызвать WS с $data из 4 элементов)
- очистить $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);
}
Любые советы приветствуются!
for(whatever){blah} fire_my_event();
- person R2-Bacca   schedule 28.03.2012