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

PHP foreach 遍历数组完全指南:用法、陷阱与最佳实践

     編輯:PHP 相關知識

基本语法

<?php
// 仅取值
foreach ($array as $value) { ... }

// 取键值
foreach ($array as $key => $value) { ... }

常见用法示例

1. 关联数组遍历

<?php
$colors = [
    'white' => '白色',
    'black' => '黑色',
    'red'   => '红色',
];

foreach ($colors as $key => $value) {
    echo "{$key} => {$value}<br>";
}
// 输出:
// white => 白色
// black => 黑色
// red => 红色

2. 修改原数组值(引用传值)

<?php
$nums = [1, 2, 3];
foreach ($nums as &$v) {
    $v *= 2;
}
unset($v); // 重要:解除引用,防止后续污染
print_r($nums); // [2, 4, 6]

核心机制:值拷贝 vs 引用

默认按值拷贝:foreach ($arr as $v) 中 $v 是副本,修改 $v 不影响原数组;$arr 也是副本(PHP 7+ 写时复制优化)。

<?php
$arr = [1,2,3];
foreach ($arr as $v) {
    $arr = []; // 修改外部变量
    echo $v;   // 输出 123 —— 遍历的是拷贝
}

引用场景下的行为差异

代码输出原因
foreach ($arr as &$v) { $arr=[]; echo $v; }1$arr 是引用,循环内修改影响迭代器
global $arr; foreach($arr as $v){ $arr=[]; echo $v; }1全局变量在 foreach 中按引用处理

经典陷阱:连续两次引用遍历

<?php
$arr = [1,2,3];
foreach ($arr as &$v) { /* ... */ }
foreach ($arr as $v) { /* ... */ } // 危险!$v 仍是引用,最后元素会被覆盖

// 正确做法三选一:
// 1. unset($v); foreach ($arr as $v) ...
// 2. 两次都用引用:foreach ($arr as &$v) ...
// 3. 复制数组:$arr2 = $arr; foreach ($arr2 as $v) ...

防御性编程技巧

  1. 确保可遍历:foreach ((array)$arr as $v) —— 防止 null/非数组报错。
  2. 引用后必 unset:unset($v) 释放对最后元素的引用。
  3. 只读场景禁用引用:避免意外修改,提升可读性。
  4. 大数组考虑 Generator:避免一次性加载全量数据。

性能对比

  • foreach:最快,专用内部迭代器,C 层实现。
  • for:需手动索引,适合数值索引数组或需控制步长。
  • each/list/while:已废弃(PHP 7.2+),慢且易错。
  • array_walk/array_map:函数调用开销大,适合函数式转换。

进阶:遍历多维数组

<?php
$users = [
    ['id'=>1, 'name'=>'Alice', 'tags'=>['php','go']],
    ['id'=>2, 'name'=>'Bob',   'tags'=>['js','ts']],
];

// 递归打印
function printArray(array $arr, int $indent = 0) {
    foreach ($arr as $k => $v) {
        echo str_repeat('  ', $indent) . "{$k} => ";
        if (is_array($v)) {
            echo "\n";
            printArray($v, $indent+1);
        } else {
            echo "{$v}\n";
        }
    }
}
printArray($users);

总结

foreach 是 PHP 遍历数组的首选:语法简洁、性能最优、功能完备。掌握值拷贝与引用的区别、连续引用遍历的陷阱、防御性写法,即可避开 90% 的坑,写出健壮高效的代码。

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