| 函數 | 作用 | 返回值 | 指針移動 |
|---|---|---|---|
| current() | 取得當前元素值 | 值 / false (指針越界) | 否 |
| next() | 指針後移一位 | 下一個元素值 / false | 是 |
| prev() | 指針前移一位 | 上一個元素值 / false | 是 |
| reset() | 指針重置到首元素 | 首元素值 / false | 是 (歸零) |
| end() | 指針移至尾元素 | 尾元素值 / false | 是 |
| key() | 取得當前鍵名 | 鍵名 / null | 否 |
| each() | 取得鍵值對並後移 (PHP 7.2 棄用) | 陣列 / false | 是 |
PHP 陣列內部維護一個指針,指向「當前元素」。foreach 會自動重置指針並迭代,但手動操作指針函數不會自動重置,需開發者自行控制。
<?php $steps = ['step one', 'step two', 'step three', 'step four']; echo current($steps); // step one next($steps); next($steps); echo current($steps); // step three reset($steps); echo current($steps); // step one
<?php
$colors = ['red', 'blue', 'green'];
while (($val = current($colors)) !== false) {
echo $val . PHP_EOL;
next($colors);
}
// 輸出: red, blue, green
陷阱:陣列含 0、''、false 等假值時,current() 返回假值導致循環提前結束。正確寫法:
while (($val = current($colors)) !== false) { ... } // 嚴格比較
// 或更佳
foreach ($colors as $val) { ... }
<?php
$fruits = [
'fruit1' => 'apple',
'fruit2' => 'orange',
'fruit3' => 'grape',
'fruit4' => 'apple',
'fruit5' => 'apple',
];
while (($name = current($fruits)) !== false) {
if ($name === 'apple') {
echo key($fruits) . PHP_EOL; // fruit1, fruit4, fruit5
}
next($fruits);
}
PHP 5.5+ yield 可構建惰性迭代器,避免手動指針管理:
function filterApples(array $arr): Generator {
foreach ($arr as $k => $v) {
if ($v === 'apple') yield $k => $v;
}
}
foreach (filterApples($fruits) as $k => $v) { echo $k; }
foreach,語義清晰、自動管理指針、支援引用修改。foreach,記得先 reset($arr),否則從上次位置開始。
4. each() 已棄用,勿在新代碼使用。