2012-03-28 52 views
0

我正在寻找正确的逻辑环通的记录,并触发一个事件每个n次。PHP - 环通记录和火灾事件每个n行

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

我需要的接口我的应用与使用的minOccurs =“0” maxOccurs的=“4”用于在单个呼叫重复元件一个web服务。假设我有22行的记录集。

我需要:

  1. 环通的记录,并与各行
  2. 第4行(8日,12日,16日......)触发事件填充数组$的数据(也称WS与$ 4个的元素数据)
  3. 空$数据和循环,直到下一个4
  4. 继续,如果行的数量不是4的倍数我必须处理剩余部分,且火灾最后一个电话

使用answer,if($i % 4 == 0)所示的模运算符,我得到每4行触发的事件,但22不是4的倍数,所以事件被触发,直到第20行,然后什么也没有。也许我需要在“过剩”中对行进行计数?

由于记录将是50,行与行200我认为的4排它没有必要运行多个查询,我错了?

在此先感谢!

UPDATE: 由下面我的答案启发终于成功地拿到剧本的工作,因为我想...也许它不是一个完美的解决方案,但按预期工作:

$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); 
} 

欢迎任何建议!

+0

您找到了正确的方法。如果它达到22,为什么它应该在21和22时发射? – aletzo 2012-03-28 17:31:29

+0

如果你想让一个“事件”每4行触发一次,你为什么还想让它在第22行上触发?此外,事件是什么?你在计算什么? – 2012-03-28 17:31:42

+0

为什么你想让它在第22行开火? – 2012-03-28 17:32:22

回答

2

如果您需要在记录结束时触发一个事件,就去做。

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指数继续循环结束了,你们住可以利用此语言属性