2012-03-28 43 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指數繼續循環結束了,你們住可以利用此語言屬性