在 PHP 開發中,陣列是最常用的資料結構之一。掌握陣列內部指標的操作,能夠靈活控制資料讀取順序、實現高效遍歷,甚至解決某些特殊場景下的效能問題。本文系統整理 PHP 陣列指標相關函數,並結合實際範例說明最佳實踐。
PHP 陣列內部維護一個指標,預設指向第一個元素。以下函數均接受陣列參數並以引用傳遞方式操作,移動失敗時返回 false。
| 函數 | 行為 | 返回值 |
|---|---|---|
next() | 將指標向下移動一位 | 當前元素的值 |
prev() | 將指標向上移動一位 | 當前元素的值 |
end() | 直接移至最後一個元素 | 最後一個元素的值 |
reset() | 重置指標至第一個元素 | 第一個元素的值 |
key():取得目前指標所指元素的鍵名(索引或關聯鍵)。current():取得目前指標所指元素的值。這兩個函數不會改變指標位置,適合在需要多次檢查同一元素時使用。
each() 函數each() 同時完成「取得目前元素鍵值資訊」與「將指標下移一位」兩個動作。返回格式為包含四個鍵的陣列:
array(
1 => 值,
'value' => 值,
0 => 鍵,
'key' => 鍵
)
當指標已超出陣列末端時,each() 返回 false,這特性常用於 while 迴圈遍歷:
<?php
$arr = ['a' => 1, 'b' => 2, 'c' => 3];
while (list($key, $val) = each($arr)) {
echo "$key => $val\n";
}
// 輸出:a => 1, b => 2, c => 3
?>
注意:使用each()遍歷結束後,陣列指標會停留在末端(false狀態),若後續需重新遍歷,必須手動呼叫reset($arr)重置指標。
list() 解構賦值list() 只能用於數字索引陣列(0, 1, 2...),無法直接處理關聯陣列。但 each() 返回的陣列同時包含數字鍵(0, 1)與字串鍵('key', 'value'),因此 list($key, $val) = each($arr) 寫法才能正常運作。
<?php
$fruits = ['apple' => '紅', 'banana' => '黃', 'grape' => '紫'];
// 保存原始指標位置
$original_key = key($fruits);
// 遍歷
while (list($k, $v) = each($fruits)) {
echo "$k : $v
";
}
// 還原指標
if ($original_key !== null) {
// 若原本指標不在第一個,需先 reset 再逐步 next
reset($fruits);
while (key($fruits) !== $original_key) next($fruits);
}
?>
foreach 操作的是陣列副本,不會移動原陣列指標,現代開發建議優先使用 foreach。熟練掌握 next/prev/end/reset、key/current 以及 each 的行為差異,能讓你在面對陣列順序控制、多重遍歷、指標狀態保存等場景時遊刃有餘。實務上,除非有特殊需求(如需在遍歷中途插入/刪除元素、或需暫停/恢復遍歷),一般建議優先使用 foreach 以提升程式碼可讀性與維護性。