应使用print_r($arr, true)配合htmlspecialchars()和<pre>标签美化输出,避免CLI或HTML下格式错乱;注意array_merge与array_merge_recursive行为差异;关键值需用var_dump或isset()验证。

print_r 输出结果太乱,怎么看清数组结构
直接看 print_r 的原始输出容易眼花,尤其合并后嵌套变深、键名重复或类型混杂时。关键不是“怎么打印”,而是“怎么让输出可读”。
- 加
true参数让它返回字符串,再用htmlspecialchars()转义后放进<pre>标签里显示,保留缩进和换行 - 别在 CLI 下只靠
print_r($arr)看——终端不会渲染换行缩进,导致所有内容挤成一行 - Web 环境下漏掉
<pre>,HTML 会把换行当空格,结构全塌
<?php $arr1 = ['a' => 1, 'b' => ['x' => 10]]; $arr2 = ['b' => ['y' => 20], 'c' => 3]; $merged = array_merge_recursive($arr1, $arr2); echo '<pre>' . htmlspecialchars(print_r($merged, true)) . '</pre>'; ?>
array_merge 和 array_merge_recursive 合并后 print_r 表现差异大
合并方式不同,print_r 显示的结构完全不同,不注意这点会误判数据是否真合并成功。
-
array_merge遇到相同字符串键会覆盖——print_r里只显示后者,容易以为“丢了数据” -
array_merge_recursive把同名键的值自动转成数组,print_r会显示多一层嵌套,比如['b'] => [10, 20] - 数字键永远追加,不管是否重复;但
print_r不会提示“这是新索引”,得自己数[0], [1], [2]...
print_r 看不到 NULL、false、0 这些“假值”的真实存在
合并后如果某字段被覆盖为 null 或 false,print_r 虽然会输出,但人眼容易忽略——尤其跟 '' 或 [] 挨在一起时。
-
print_r对null输出NUL(小写),对false输出bool(false),但字体小、颜色没区别,扫一眼就滑过去 - 真正保险的做法是配合
var_dump:它明确标出类型和长度,比如string(0) ""和NULL一目了然 - 调试合并逻辑时,别只信
print_r的“看起来有值”,要查isset()和array_key_exists()的实际返回
想快速比对合并前后,别手动画表格
人工对照两个 print_r 输出效率低、易出错,尤其键多或层级深的时候。
立即学习“PHP免费学习笔记(深入)”;
- 用
print_r($a, true)和print_r($b, true)分别转成字符串,再丢给diff命令(CLI)或在线文本比对工具 - PHP 内部可用
array_diff_assoc或array_diff_recursive(需自定义)定位具体哪些键变了,比肉眼扫快得多 - 开发时建议封装一个调试函数,自动加
<pre>、高亮null/false、标出新增/丢失键——print_r本身只是个裸输出工具,别指望它替你思考结构
真正麻烦的不是 print_r 怎么用,而是合并逻辑本身是否符合预期。输出再清楚,也掩盖不了 array_merge 和 + 运算符行为差得远这个事实。



















