2014-06-25 96 views
0

我在PHP中構建了一個測試模擬,由於速度問題我進行了重建。測試必須實際運行一定的天數,小時數,然後在該小時內完成。在數組中找到最後一個非零值

我創建了一個包含每小時包含多少項目的數組。所以:

$arrItemsEachHour(
0=> 0 
1=> 0 
2=> 0 
3=> 0 
4=> 0 
5=> 0 
6=> 0 
7=> 0 
8=> 1 
9=> 2 
10=> 4 
11=> 5 
12=> 6 
13=> 7 
14=> 7 
15=> 8 
16=> 8 
17=> 8 
18=> 7 
19=> 6 
20=> 5 
21=> 4 
22=> 4 
23=> 1 
24=> 0 
); 

這是每天的相同數組。

我需要在仿真運行後更新數據庫。我用的是mysql插入查詢,如下所示:

$strSql = 'insert into results (id, day, hour, item, won, lost) values (1,2,3,6,2,4), 
(1,2,4,7,3,4),(),()......();'; 

我需要知道模擬結束,所以我可以結束MySQL的字符串。 $ strSql不在for循環中,在這些循環中,按照上面介紹的方式創建和保存值。

所以我需要做一個if語句,當日期等於最後一天(我手邊有這個值)並且最後一個非零值當前在for循環中時,它會關閉mysql語句。

這是我的for循環的樣子:

for($i = 1; $i <= $this->intNumberOfDays; $i ++) { 


     for($n = 0; $n < 24; $n ++) { 

      for($k = 0; $k <= $arrItemsEachHour [$n]; $k ++) { 

          } 
        } 
} 

我的問題是:

我怎麼能決定將來我有一個數組的最後一個非零值?

答:

$length = count($arrItemsEachHour) -1; 
for($k = $length; $k >= 0; $k --) 
{ 
    if($arrItemsEachHour[$k] != 0) 
    { 
     // From $arrItemsEachHour[$k + 1] to $arrItemsEachHour[23] there are 0 
    } 
} 

如果聲明:

if ($i == $this->intNumberOfDays && $intLastHour == $n && $k == $arrItemsEachHour [$n]) 
{ 'values();'} else {'values(),';} 
+0

我會研究使用'filter()'和'end()'。過濾掉所有零值,然後轉到數組的末尾。 –

+0

你需要得到最後一個非零元素形式$ arrItemsEachHour數組? – Kailas

回答

5

開始在數組的結尾,並循環,直到你有一個非零值。數組中第一個非零值後面跟着0。

$length = count($arrItemsEachHour) -1; 
for($k = $length; $k >= 0; $k --) 
{ 
    if($arrItemsEachHour[$k] != 0) 
    { 
     // From $arrItemsEachHour[$k + 1] to $arrItemsEachHour[23] there are 0 
    } 
} 

帖子編輯以適應傑伊·布蘭查德的想法

+0

好主意!將盡快嘗試這個! – Kevin

+0

第一次比較不應該是'$ k = count($ arrItemsEachHour)'?如果陣列在某個點改變了長度? –

+0

@JayBlanchard將永遠是23(0-23)。每天24小時。 – Kevin

1

我只想循環數組在第一個找到最後非零:

$lastKey = -1; 
foreach($arrItemsEachHour as $key => $val){ 
    if(!empty($val)){ 
     $lastKey = $key; 
    } 
} 
for($n = 0; $n < 24; $n ++) { 
    for($k = 0; $k <= $arrItemsEachHour [$n]; $k ++) { 
     if($n == $lastKey){ 
      //Last! 
      //Do some stuff 
      break;//Break out the loop 
     }else{ 
      //Not last 
     } 
    } 
} 
+0

謝謝!雖然我認爲@百齡壇的代碼更短,更高效。 – Kevin

+0

@Ajaxkevi當然,我會與百齡壇的,如果我是提問者:) – Jim

3

像這樣的事情?刪除零值,取最後一個元素並提取密鑰。

$arr = array_filter($arrItemsEachHour); 
end($arr); 
$lastNonZeroKey = key($arr); 
var_dump($arrItemsEachHour[$lastNonZeroKey], $lastNonZeroKey); 
+2

Array_filter默認刪除false,0和「」。 –

0

end(array_diff($ arrItemsEachHour,array(0)));

相關問題