$urls = ['aaa','bbb','ccc','ddd'];
foreach ($urls as $url) {
echo "URL: $url\n";
}
$urls = ['aaa','bbb','ccc','ddd'];
while (list($key, $val) = each($urls)) {
echo "URL: $val\n";
}
$urls = ['aaa','bbb','ccc','ddd'];
for ($i = 0; $i < count($urls); $i++) {
echo "URL: {$urls[$i]}\n";
}
$arr = [1,2,3];
foreach ($arr as &$v) { $v *= 2; }
unset($v); // 關鍵:解除引用,避免污染後續循環
print_r($arr); // [2,4,6]
$arr = [];
for ($i = 0; $i < 50000; $i++) $arr[] = $i * rand(1000,9999);
function microtimeFloat() {
[$usec, $sec] = explode(' ', microtime());
return (float)$usec + (float)$sec;
}
// for
$t = microtimeFloat();
for ($i = 0; $i < count($arr); $i++) { $v = $arr[$i]; }
echo "for: " . round(microtimeFloat() - $t, 7) . "s\n";
// while + each
$t = microtimeFloat();
while (list($k, $v) = each($arr)) { }
echo "while: " . round(microtimeFloat() - $t, 7) . "s\n";
// foreach
$t = microtimeFloat();
foreach ($arr as $v) { }
echo "foreach: " . round(microtimeFloat() - $t, 7) . "s\n";
for: 0.0228429s while: 0.0544658s foreach: 0.0085628s
| 維度 | foreach | while+each | for |
|---|---|---|---|
| 實現層級 | ZEND 內建 opcode | 用戶空間函數組合 | 用戶空間迴圈 |
| 陣列操作 | 遍歷副本(寫時複製) | 移動內部指針 | 索引直接訪問 |
| 函數調用 | 無 | each() 每次調用 | count() 每次調用(可優化) |
| 鍵值獲取 | 原生支援 | list() 解構 | 手動 $arr[$i] |
count($arr) 提取到循環外 $len = count($arr); for($i=0;$i<$len;$i++)each() 已棄用(PHP 7.2)、移除(PHP 8.0)foreach ($arr as &$v) { ... } unset($v);foreach ($arr as $v) 觸發 COW(寫時複製),極低開銷foreach ($arr as $k => &$v) { $v = ...; }// 語義化檢查,避免手寫循環
if (array_is_list($arr)) { /* 索引陣列邏輯 */ }
if (array_any($arr, fn($v) => $v > 100)) { /* 存在滿足條件 */ }
if (array_all($arr, fn($v) => is_int($v))) { /* 全部滿足 */ }
foreach 為王。它是 ZEND 專門優化的內建遍歷機制,無論陣列大小、鍵類型、是否修改,都是綜合效能與可讀性的最優選。其他方式僅在極特殊歷史兼容或極簡邏輯下出現。