print_r($arr, true)适合调试时查看数组结构,但禁用于生产环境;foreach嵌套仅适用于固定二维数组;递归函数需用is_array()判断并控制缩进;json_encode()适用于纯标量数据且需json格式时。

用 print_r() 快速查看结构,但别在生产环境直接用
开发调试时最常用的是 print_r($arr, true),它能原样输出多维数组的嵌套关系和类型。注意第二个参数设为 true 才返回字符串,否则直接输出到页面(可能破坏 HTML 结构)。不要在正式接口里用它输出,因为结果不可控、无格式化控制、且含 PHP 内部标识(比如 Array 字符串),前端解析会出错。
foreach 套 foreach 只适用于已知层数的数组
如果确定是二维数组,两层 foreach 最直观:
foreach ($data as $key => $item) {
echo "$key: ";
foreach ($item as $subkey => $val) {
echo "$subkey=$val ";
}
echo "\n";
}
但一旦层数不确定或动态变化,硬写多层循环就失效了——你没法预判到底要嵌几层,代码也立刻变得难以维护。
递归函数必须带终止条件,避免无限调用
自己写递归遍历,核心是判断当前元素是否为数组。常见错误是忘了用 is_array() 检查,导致对字符串或数字调用 foreach 报 Warning;或者没控制缩进/分隔,输出全挤在一起看不出层级。
- 每次进入下一层前加缩进(比如
str_repeat(' ', $depth)) - 递归调用时传入
$depth + 1,初始调用传0 - 只对
is_array($value) && !empty($value)的情况继续递归,空数组可直接跳过
示例片段:
function dumpArray($arr, $depth = 0) {
foreach ($arr as $key => $value) {
echo str_repeat(' ', $depth) . "$key => ";
if (is_array($value)) {
echo "\n";
dumpArray($value, $depth + 1);
} else {
echo "$value\n";
}
}
}
用 json_encode() 替代自定义递归,前提是数据纯标量
如果数组里只有字符串、数字、布尔、null 和嵌套数组(不含资源、对象、闭包),json_encode($arr, JSON_PRETTY_PRINT) 是更轻量的选择。它天然支持任意深度,输出格式统一,还能直接给前端用。但遇到 DateTime 对象、mysqli 实例这类非 JSON 可序列化类型,会静默失败或报错,得先用 array_map() 或 __toString() 预处理。
层级深、含特殊类型、又需要自定义格式(比如加类型提示、过滤敏感字段)时,还是得回到递归函数——那部分逻辑没法靠一个函数调用绕过去。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











