2010-04-28 104 views
3

我正在寫一個簡單的PHP頁面,並且使用了幾個foreach循環。如何確保在PHP的'foreach'循環中重置值?

下面是腳本:

$arrs = array("a", "b", "c"); 

foreach ($arrs as $arr) { 
    if(substr($arr,0,1)=="b") { 
     echo "This is b"; 
    }  
} // End of first 'foreach' loop, and I didn't use 'ifelse' here. 

當這個foreach結束,我又寫了foreach循環,其中在foreach循環中的所有值是一樣的,在以前的foreach

foreach ($arrs as $arr) { 
    if(substr($arr,0,1)=="c") { 
     echo "This is c"; 
    }  
} 

我不知道這是否是一個很好的做法,有兩個foreach循環使用相同的價值觀和密鑰。

這些值是否會在第一個foreach循環中被覆蓋?

+2

代碼縮進是可怕的。請讓這更可讀。 – 2010-04-28 10:48:25

+0

我已經更改了代碼縮進 – 2010-04-28 10:59:01

回答

5

,直到你開始使用的引用,然後就可以得到奇怪的行爲,例如它的確定:

<?php 
$array = array(1,2,3,4); 
//notice reference & 
foreach ($array as & $item) { } 

$array2 = array(10, 11, 12, 13); 
foreach ($array2 as $item) { } 

print_r($array); 

輸出:

Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 3 
    [3] => 13 
) 

因爲第一個foreach離開$item作爲對$array[3]的參考,$array[3]被依次設置爲$array2中的每個值。

就可以解決這個在第一foreach,這將刪除引用後做unset($item),但,這實際上不是一個問題,你的情況因爲你沒有使用用foreach引用。從documentation of foreach

1

因爲您沒有寫入數組,只能從中讀取數據並打印出來,數組中的值將不會更改。

您可以節省時間通過數組循環兩次,但這樣做的:

$arrs = array("a", "b", "c"); 

foreach ($arrs as $arr) { 
    if(substr($arr,0,1)=="b") { 
     echo "This is b"; 
    } 
    if(substr($arr,0,1)=="c") { 
     echo "This is c"; 
    } 
} 
4

兩個顯着的說明:

注意:當foreach開始執行時,內部數組指針自動復位到所述陣列的第一個元素。這意味着您不需要在foreach循環之前撥打reset()

注:除非數組是被引用,foreach指定數組的一個副本而不是該數組本身運行foreach對數組指針有一些副作用。 不要在foreach期間或之後依靠陣列指針而不重置它

1

所有你需要的是1個foreach循環。

或者更短的方法是什麼喬恩說,是這樣的:

$arrs = array("a", "b", "c"); 

foreach ($arrs as $arr) 
    if ($arr != "a") 
     echo 'This is ' . $arr; 

這比使用SUBSTR更容易和更快,因爲你已經在使用foreach循環。儘量不要用一噸的if語句,如果你發現自己這樣做,最好是使用switch語句,更快的污染它。

歡呼:)