我正在寻找正确的逻辑来循环通过记录集并每n次触发一个事件。
在谷歌上搜索,我发现了一些关于类似情况的讨论,但似乎解决方案不符合我的需求。
我需要将我的应用程序与一个Web服务接口,该Web服务在一次调用中使用minOccurs="0"maxOccurs="4"作为可重复元素。假设我有一个22行的记录集。
我需要:
- 循环遍历记录集并用每一行填充数组$data
- 在第4行(第8、第12、第16…)激发事件(使用4个元素的$data调用WS)
- 清空$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($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
索引在循环结束后继续存在,您可以利用此语言属性