PHP - цикл через набор записей и событие запуска каждые n строк - PullRequest
0 голосов
/ 28 марта 2012

Я ищу правильную логику для циклического прохождения набора записей и запуска события каждый n раз.

Поиск в Google Я нашел некоторое обсуждение подобных ситуаций, но кажется, что решения неt соответствует моим потребностям.

Мне нужно связать мое приложение с веб-сервисом, который использует minOccurs = "0" maxOccurs = "4" для повторяемых элементов в одном вызове.Допустим, у меня есть набор записей из 22 строк.

Мне нужно:

  1. пройти через набор записей и заполнить массив $ data каждой строкой
  2. в 4-й строке (8-й, 12-й, 16-й ...) запустить событие (вызвать WS с $ data из 4 элементов)
  3. empty $ data и продолжить цикл до следующего 4-го
  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);
}

Любой совет приветствуется!

1 Ответ

2 голосов
/ 28 марта 2012

Если вам нужно запустить событие в конце набора записей, просто сделайте это.

for($i=0 .... ) {
 // do yourcalculation
}

//fire your event for the end of the recordset

Если вам нужно запустить событие только тогда, когда у вас есть запасные записи после последнего события, используйтеif if

$interleave = 4; // or whaterver you interval you need
for($i=0 .... ) {
 // do yourcalculation
}

if (!($i % $interleave)) {
    // fire your event
}

Индекс $i продолжает действовать после окончания цикла, и вы можете использовать это свойство языка

...