PHP 陣列內部維護一個「指標」指向當前元素。掌握指標操作函式,能高效實作迭代、查找、資料轉換等邏輯,避免不必要的 foreach 或計數器。
| 函式 | 功能 | 回傳值 | 指標移動 |
|---|---|---|---|
current($arr) | 取得當前元素值 | 值 / false (指標越界) | 不移動 |
next($arr) | 指標前進一位,取得新當前值 | 值 / false | +1 |
prev($arr) | 指標後退一位,取得新當前值 | 值 / false | -1 |
end($arr) | 指標移至最後一個元素 | 最後值 / false | 移至尾端 |
reset($arr) | 指標重置至第一個元素 | 第一個值 / false | 移至頭部 |
key($arr) | 取得當前元素鍵名 | 鍵名 / null | 不移動 |
each($arr) | 取得當前鍵值對並前進 | [key, value, 0, key] / false | +1 |
$transport = ['foot', 'bike', 'car', 'plane']; echo current($transport); // foot echo next($transport); // bike echo next($transport); // car echo prev($transport); // bike echo end($transport); // plane echo current($transport); // plane (指標未動) reset($transport); echo current($transport); // foot
$first = reset($arr); // 重置並取首 $last = end($arr); // 移至尾並取尾 // 注意:end() 會改變指標,後續 current() 會是最後元素
while (($val = current($data)) !== false) {
if (shouldSkip($val)) {
next($data);
continue;
}
if (needReprocess($val)) {
prev($data); // 回退重處理
continue;
}
process($val);
next($data);
}
function uniqueKeepOrder(array $arr) {
$seen = [];
reset($arr);
while (($val = current($arr)) !== false) {
$k = key($arr);
if (isset($seen[$val])) {
// 刪除當前元素,指標自動指向下一個
unset($arr[$k]);
} else {
$seen[$val] = true;
next($arr);
}
}
return array_values($arr); // 重建索引
}
$headers = ['id', 'name', 'email'];
$values = [1, 'John', 'john@example.com'];
reset($headers); reset($values);
while (($h = current($headers)) && ($v = current($values))) {
echo "$h => $v\n";
next($headers); next($values);
}
next(['a','b']) 會報錯「Only variables should be passed by reference」。$b = $a; next($a); 不影響 $b 的指標(PHP 陣列寫時複製)。false 與布林值元素衝突:陣列含 false 時,無法用回傳值判斷結束。改用 key($arr) !== null 或 foreach。foreach 中混用指標函式:foreach 會重置指標,導致不可預期行為。unset 導致重建索引較慢;大量資料優先考慮 array_filter、array_values 等內建函式。ArrayIterator / IteratorIterator:物件導向封裝,支援 seek()、valid()、current()、next()、key(),可實作自訂迭代邏輯。Generator (yield):惰性產生序列,記憶體友善,適合大資料流處理。illuminate/support Collection、ds\Vector 提供鏈式操作、不可變資料結構。理解陣列指標機制,能在特定場景下寫出更精簡、高效的程式碼。日常開發中,優先使用 foreach、陣列函式、Collection 等高層抽象,僅在需要精確控制迭代位置時才直接操作指標。