首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 陣列遍歷四大姿勢效能大比拼:foreach 完勝

     編輯:PHP 綜合知識

四種遍歷方式

1. foreach(推薦標準)

$urls = ['aaa','bbb','ccc','ddd'];
foreach ($urls as $url) {
    echo "URL: $url\n";
}

2. while + list + each(舊式)

$urls = ['aaa','bbb','ccc','ddd'];
while (list($key, $val) = each($urls)) {
    echo "URL: $val\n";
}

3. for + count(索引陣列)

$urls = ['aaa','bbb','ccc','ddd'];
for ($i = 0; $i < count($urls); $i++) {
    echo "URL: {$urls[$i]}\n";
}

4. foreach 引用修改(需解除引用)

$arr = [1,2,3];
foreach ($arr as &$v) { $v *= 2; }
unset($v); // 關鍵:解除引用,避免污染後續循環
print_r($arr); // [2,4,6]

效能基準測試(50,000 元素)

$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

深度原理解析

維度foreachwhile+eachfor
實現層級ZEND 內建 opcode用戶空間函數組合用戶空間迴圈
陣列操作遍歷副本(寫時複製)移動內部指針索引直接訪問
函數調用無each() 每次調用count() 每次調用(可優化)
鍵值獲取原生支援list() 解構手動 $arr[$i]

關鍵優化建議

  • 首選 foreach:語法最簡、效能最優、語義最清晰
  • for 循環優化:將 count($arr) 提取到循環外 $len = count($arr); for($i=0;$i<$len;$i++)
  • 避免 while+each:each() 已棄用(PHP 7.2)、移除(PHP 8.0)
  • 引用遍歷必須 unset:foreach ($arr as &$v) { ... } unset($v);
  • 大陣列只讀遍歷:foreach ($arr as $v) 觸發 COW(寫時複製),極低開銷
  • 需修改鍵值:foreach ($arr as $k => &$v) { $v = ...; }

PHP 8.1+ 新增:array_is_list / array_any / array_all

// 語義化檢查,避免手寫循環
if (array_is_list($arr)) { /* 索引陣列邏輯 */ }
if (array_any($arr, fn($v) => $v > 100)) { /* 存在滿足條件 */ }
if (array_all($arr, fn($v) => is_int($v))) { /* 全部滿足 */ }

總結

foreach 為王。它是 ZEND 專門優化的內建遍歷機制,無論陣列大小、鍵類型、是否修改,都是綜合效能與可讀性的最優選。其他方式僅在極特殊歷史兼容或極簡邏輯下出現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved