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

PHP-循环通过记录集和每n行触发事件,php,loops,for-loop,foreach,recordset,Php,Loops,For Loop,Foreach,Recordset,我正在寻找正确的逻辑来循环一个记录集,并每n次触发一个事件 在谷歌上搜索时,我发现了一些类似情况的讨论,但似乎解决方案不符合我的需要 我需要将我的应用程序与使用minOccurs=“0”maxOccurs=“4”的Web服务连接起来,以便在单个调用中使用可重复元素。假设我有一个22行的记录集 我需要: 循环遍历记录集,并用每行填充数组$数据 在第4行(第8、12、16…)触发事件(使用4个元素的$data调用WS) 清空$data并继续循环到下一个第4个 如果行数不是4的倍数,我必须处理剩余的行

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

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

我需要将我的应用程序与使用minOccurs=“0”maxOccurs=“4”的Web服务连接起来,以便在单个调用中使用可重复元素。假设我有一个22行的记录集

我需要:

  • 循环遍历记录集,并用每行填充数组$数据
  • 在第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的倍数)

    用于($i=1;$ifire\u事件($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);
    }
    
    if($total_rows%$interleave!==0){
    对于($i=$round\u rows;$i<$total\u rows+1;$i++){
    $data[$i]=$result[$i];
    }
    $this->fire_事件($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
    索引在循环结束后继续有效,您可以利用此语言属性

    您找到了正确的方法。如果它达到22,为什么要在21和22中触发?如果您想要“事件”要每4行发射一次,你为什么要在第22行发射一次?还有,事件是什么?你在计算什么吗?为什么要在第22行发射一次?如果它不能被4整除,你为什么要在最后一行发射一次?我感觉你想这样做。下面@Eineki的答案是正确的。你需要做的就是发射一次循环结束时的事件(完全在循环外)(无论什么){blah}fire_my_event();
    $interleave = 4; // or whaterver you interval you need
    for($i=0 .... ) {
     // do yourcalculation
    }
    
    if (!($i % $interleave)) {
        // fire your event
    }