php中二维数组和多维数组的遍历是日常开发的基础操作,不同的遍历方式适用于不同的数组结构和业务场景,选择合适的方法可以大幅提升代码的执行效率和可读性。

二维数组的基础遍历方法
使用foreach循环遍历
foreach是php中遍历数组最常用的方式,针对二维数组可以先遍历外层数组,再遍历内层数组,逻辑清晰易懂,适合大多数常规二维数组结构。
<?php
// 定义一个简单的二维数组
$userList = [
['id' => 1, 'name' => '张三', 'age' => 20],
['id' => 2, 'name' => '李四', 'age' => 22],
['id' => 3, 'name' => '王五', 'age' => 25]
];
// 遍历二维数组
foreach ($userList as $user) {
echo "用户ID:{$user['id']},姓名:{$user['name']},年龄:{$user['age']}<br/>";
// 如果内层还有数组,可以继续嵌套foreach
foreach ($user as $key => $value) {
echo "{$key}:{$value}<br/>";
}
}
?>
使用for循环遍历
当二维数组的键名是连续的数字索引时,可以使用for循环遍历,这种方式在需要控制遍历次数或者获取索引值的场景下比较实用。
<?php
// 数字索引的二维数组
$scoreList = [
[90, 85, 88],
[78, 92, 85],
[88, 90, 87]
];
$outerLen = count($scoreList);
for ($i = 0; $i < $outerLen; $i++) {
echo "第{$i}个学生的成绩:<br/>";
$innerLen = count($scoreList[$i]);
for ($j = 0; $j < $innerLen; $j++) {
echo "科目{$j}成绩:{$scoreList[$i][$j]}<br/>";
}
}
?>
多维数组的通用遍历方法
递归遍历多维数组
当数组的维度不固定,或者嵌套层级较深时,使用递归遍历可以统一处理所有层级的元素,不需要提前知道数组的具体结构。
<?php
// 定义一个不规则的多维数组
$data = [
'name' => '测试数据',
'info' => [
'id' => 1001,
'tags' => ['php', '数组', '遍历'],
'extra' => [
'create_time' => '2024-01-01',
'status' => 1
]
]
];
// 递归遍历函数
function traverseArray($arr, $level = 0) {
foreach ($arr as $key => $value) {
// 输出缩进,区分层级
echo str_repeat(' ', $level);
if (is_array($value)) {
echo "{$key} 是数组,内容如下:<br/>";
// 递归调用处理子数组
traverseArray($value, $level + 1);
} else {
echo "{$key}:{$value}<br/>";
}
}
}
// 调用递归函数
traverseArray($data);
?>
使用array_walk_recursive函数遍历
php内置的array_walk_recursive函数可以对数组中的每个叶子节点(非数组元素)应用回调函数,适合只需要处理最内层元素的场景。
<?php
$complexArr = [
'a' => 1,
'b' => [
'c' => 2,
'd' => [
'e' => 3,
'f' => 4
]
],
'g' => 5
];
// 回调函数处理每个叶子节点
function handleLeaf($value, $key) {
echo "键:{$key},值:{$value}<br/>";
}
// 调用内置函数遍历
array_walk_recursive($complexArr, 'handleLeaf');
?>
不同遍历方式的适用场景对比
| 遍历方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| foreach嵌套 | 固定层级的二维数组 | 逻辑简单,易理解 | 无法处理维度不固定的数组 |
| for循环 | 数字索引的二维数组 | 可获取索引值,控制遍历范围 | 仅支持连续数字索引,灵活性低 |
| 递归遍历 | 维度不固定的多维数组 | 通用性强,适配任意嵌套结构 | 层级过深可能出现栈溢出问题 |
| array_walk_recursive | 仅需处理多维数组叶子节点 | 内置函数效率高,代码简洁 | 无法处理数组类型的节点 |
遍历注意事项
- 遍历过程中如果需要修改数组元素,建议在foreach中使用引用传递,避免修改无效,例如
foreach ($arr as &$value) {},使用后及时销毁引用unset($value); - 递归遍历时如果数组嵌套层级超过php默认的递归限制,可以通过
ini_set('xdebug.max_nesting_level', 1000);调整限制,但要避免无限递归的情况 - 处理大数组遍历时,优先选择效率更高的方式,避免不必要的嵌套循环,减少性能损耗