2015-05-03 78 views
-4

我通常寫我for循環像這樣:未定義抵消了循環

for ($i=0; $list[$i]; $i++) 

但今天我開始了警告:

注意:未定義抵消:5`

這個數組有5個元素,所以我知道爲什麼我要得到它,但是奇怪的是我從來沒有通過編寫像這樣的循環得到錯誤。即使在這臺服務器上(或者我認爲)。

我知道如何解決它,這樣做

$ct = count($list); 
for ($i=0; $i < $ct; $i++) 

但這不是問題的關鍵;我想知道它爲什麼會發生。

我以前的服務器是否都有錯誤報告關閉,這個有它,我從來沒有注意到它?

我一直在寫for這樣的循環很多年,所以它看起來像我會注意到的。這是PHP中的最新更新嗎?

+0

我大概猜測所有其他服務器都報錯了錯誤(當服務器沒有處於暫存狀態時,這是正常的)。第二個代碼塊是您如何正確執行或使用foreach循環! – Rizier123

+1

您應該使用'foreach'來代替。 – Ulti

+3

你不應該使用這個。如果'$ list [$ i]'包含一個布爾型'false'值,即使有更多的項目,循環也會停止。 – ByteHamster

回答

3

首先,你數組可以包含失序鍵,甚至沒有數字鍵,例如,array(0 => 'a', 2 => 'b')沒有1偏移,所以當你試圖通過它與for循環迭代它會尋找1上偏移第二次迭代($i = 1)從而導致通知(它將永遠達不到2在這種情況下的偏移量 - 另一個缺陷)。

其次,$list[$i]可以包含nullfalse00.0"0"'0'''""array(),從而評估對false並造成與環(它不會提高的通知雖然破,但代表爲什麼這種方法不好)。

您應該使用foreach循環,而不是forarray_values()重新索引您的陣列通過它與for迴路循環之前(實際上它會返回一個新)。

+0

我不認爲這是失序的關鍵,但這是一個很好的觀點。 – felwithe

+0

@felwithe:底線是:你沒有'for'循環在你的數組中提供的鍵。無論您的通知是關閉還是剛剛運行(讓我們同意這可能是第一次),但無論如何,這是一個糟糕的做法。 – potashin

+0

在Perl中很常見;在一天結束時,我只是想檢查數組索引是否存在。我猜通知被關閉了,因爲錯誤肯定不是,因爲12+我一直在使用這個。這就是爲什麼我認爲它一定是最近的變化,但我想這是一串很長的巧合,導致我從未遇到過這個通知。 – felwithe