PHP-循环通过记录集和每n行激发事件


PHP - Loop thru recordset and fire event each n rows

我正在寻找正确的逻辑来循环通过记录集并每n次触发一个事件。

在谷歌上搜索,我发现了一些关于类似情况的讨论,但似乎解决方案不符合我的需求。

我需要将我的应用程序与一个Web服务接口,该Web服务在一次调用中使用minOccurs="0"maxOccurs="4"作为可重复元素。假设我有一个22行的记录集。

我需要:

  1. 循环遍历记录集并用每一行填充数组$data
  2. 在第4行(第8、第12、第16…)激发事件(使用4个元素的$data调用WS)
  3. 清空$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);
}

欢迎任何建议!

如果需要在记录集的末尾激发事件,只需执行即可。

for($i=0 .... ) {
 // do yourcalculation
}
//fire your event for the end of the recordset

如果您只需要在上次触发事件后有备用记录时才触发事件,则使用If

$interleave = 4; // or whaterver you interval you need
for($i=0 .... ) {
 // do yourcalculation
}
if (!($i % $interleave)) {
    // fire your event
}

$i索引在循环结束后继续存在,您可以利用此语言属性