2022年11月25日

PHP Array 迴圈作法。比較 for 及 foreach 用法

本篇為 PHP 系列

PHP 的 Array 很方便也很彈性使用,當我們想要對 PHP Array 做迴圈的時候,比較常用的兩種做法是 for 及 foreach。而在大部分的情況下,foreach 是比較建議使用的方式。

本文會針對 PHP Array 的用法稍作說明,然後解釋 for loop 及 foreach 的用法,如果你已經熟悉 Array 用法可以直接跳到後面。

PHP Array

PHP 中的 Array,也就是陣列,是由成對的 key 和 value 所組成的資料結構。 key 在大部分情況下可以是任意字串或數字。

array(
    key  => value,
    key2 => value2,
    key3 => value3,
    ...
)

例如,key 都是字串:

$grades = array(
    "Excellent" => 100,
    "Good" => 80,
    "Normal" => 60,
    "Bad" => 40,
);

print_r($grade);
Array
(
    [Excellent] => 100
    [Good] => 80
    [Normal] => 60
    [Bad] => 40
)

或數字跟字串混用的 key:

$gradeStrings = array(
    100 => "Excllent",
    80 => "Good",
    60 => "Normal",
    40 => "Bad",
    "F" => "Failed"
);

print_r($gradeStrings);
Array
(
    [100] => Excllent
    [80] => Good
    [60] => Normal
    [40] => Bad
    [F] => Failed
)

如果如果我們沒有明確提供 key, PHP 則會自動產生索引 (index) ,會由 0 開始往後編號:

例如,這邊只有提供三個 value:

$fruits = ['Banana', 'Apple', 'Orange'];
print_r($fruits);
Array
(
    [0] => Banana
    [1] => Apple
    [2] => Orange
)

我們可以利用 [] (square brackets,中/方括號) 來取出特定 key 的 value。

print($grades['Excellent']); // 1000
print($fruits[2]); // Orange

PHP Array 的 key 和 index 兩個用詞經常被混著使用。以 PHP Array 的角度來看,比較精準的用法會是 key,但是概念上來說,遇到 0、1、2... 這種按照順序編碼的情況,有些人會稱呼這類 key 為 index。

for loop

我們經常會需要遍歷 array 中的 value,一個一個拿出來看、或使用。 當 array 的 key 是由 0 開始編號的 index,我們可以使用比較傳統 for loop 來使用,例如:

$fruits = ['Banana', 'Apple', 'Orange'];

for ($i = 0; $i < count($fruits); $i++) {
    print("Fruit: {$fruits[$i]} \n");
}

Fruit: Banana 
Fruit: Apple 
Fruit: Orange 

利用 count 來算出 array 中共有幾個元件,這邊是 3 個。$i 在 loop 的過程中逐次 + 1,直到 $i == 3 後離開迴圈。

然而如果 Array 的 key 是字串,或者不是按照順序的數字,用 for loop 就會比較難以處理,這個時候就會需要使用 foreach

foreach loop

foreach 是 PHP 中專門用來遍歷 array 的語法,基本的格式如下:

格式 1:

foreach (iterable_expression as $value)

也可以把 $key 拿出來用:

格式 2:

foreach (iterable_expression as $key => $value)

foreach 中,我們不用管 array 裡面有幾個元件,PHP 會自動依序處理。

現在來看看範例,使用前面的 $grades 為例子:

foreach ($grades as $grade) {
    print("Grade: {$grade} \n");
}

這段程式結果如下:

Grade: 100 
Grade: 80 
Grade: 60 
Grade: 40 

可以看到,使用 foreach 時,我們不必使用 [] 來拿出 array 中的 value,PHP 會自動幫我們放到我們指定的變數中,例如範例中,我們把目前的值放到 $grade 中,在 loop 的區塊中就可以直接使用這個變數。

如果有需要用到 $key 的話,可以用 foreach 的另一種格式:

foreach ($grades as $gradeText => $grade) {
    print("Grade: {$gradeText}({$grade}) \n");
}

這段程式結果如下:

Grade: Excellent(100) 
Grade: Good(80) 
Grade: Normal(60) 
Grade: Bad(40) 

這邊我故意不使用 $key,而使用了另一個變數名稱 $gradeText,目的是讓大家看到這個變數名稱是可以自定義的,而不一定要叫做 $key

在範例輸出中,可以看到 array 的 $key$value 都被依序提取出來了。

最後,foreach 除了可以處理字串行別 $key 以外,其實用來處理數字 $key 也是可以的。

使用前面的 $fruits array 為範例。

foreach($fruits as $fruitIndex => $fruit) {
    print("Fruit: {$fruitIndex} - {$fruit} \n");
}

輸出:

Fruit: 0 - Banana 
Fruit: 1 - Apple 
Fruit: 2 - Orange 

當然,如果我們用不到 $fruitIndex ,那就不使用 $key ,採用 foreach 格式 1 也是可以的。

結論

foreach 的用法比較簡潔,也不用自己處理 $key 和元件的數量。

雖然使用 for 也有方法可以處理字串類型的 $key 但會讓整體程式碼看起來變複雜,真的要使用的話可以參考 currentnextkey 等內部指標的操作。

因此,大部分情況下,推薦優先使用 foreach

參考

PHP: Arrays - Manual

PHP: foreach - Manual

本篇為 PHP 系列

PHP Array 初學者可以參考《Array 教學,基本概念與操作》《Array 教學,10 個必學的 PHP Array 實用作法與方法》