var_dump() 默认截断深层/大数组,需调 xdebug 深度、加 exit 或 标签;print_r 适合看结构但有编码限制,json_encode 可暴露中文问题;foreach 修改需引用并 unset,json_decode 默认返对象须加 true 转数组。

var_dump() 为什么总显示不全数组?
默认情况下 var_dump() 对嵌套较深或元素较多的数组会自动截断,尤其在 CLI 环境下只显示前几层,Web 环境可能被 HTML 格式干扰。这不是 bug,是 PHP 的默认输出限制。
- 加
ini_set('xdebug.var_display_max_depth', 10);(如果启用了 Xdebug) - CLI 下用
var_dump($arr);后立刻接exit;防止后续输出覆盖或截断 - Web 环境中包裹在
<pre class="brush:php;toolbar:false;"></pre>里:<pre class="brush:php;toolbar:false;"><?php var_dump($arr); ?>
- 避免在循环里反复调用
var_dump(),容易混淆输出顺序;改用error_log(print_r($arr, true), 3, '/tmp/debug.log');
print_r() 和 json_encode() 哪个更适合看结构?
print_r() 更适合快速看键值和嵌套层级,但对非 UTF-8 字符串或资源类型会显示不完整甚至报错;json_encode() 能暴露编码问题(比如中文变 null),但会丢掉非标量类型(如 resource、object 未实现 JsonSerializable 时)。
- 调试纯数据数组(尤其含中文):先试
json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT),失败就说明有非法字符或类型 - 确认键名是否为字符串还是整数:用
array_keys($arr)单独 dump,因为print_r()有时把数字字符串键显示得和整数键一样 - 注意
print_r($arr, true)返回字符串,可用于日志,但别直接 echo 到 HTML 里——特殊字符会被渲染成空格或乱码
foreach 中修改数组却没生效?
PHP 数组是“写时复制”,foreach($arr as $k => $v) 中的 $v 是副本,改它不影响原数组;而 foreach($arr as &$v) 引用遍历才可写入,但用完必须 unset($v),否则下次循环可能污染下一个数组。
- 安全写法:
$arr = ['a' => 1, 'b' => 2]; foreach ($arr as $k => &$v) { $v *= 2; } unset($v); // 必须加 - 更推荐函数式写法:
array_map()或array_walk(),语义清晰且无引用残留风险 - 想边遍历边删元素?别用
foreach,改用for($i = count($arr) - 1; $i >= 0; $i--)倒序操作,或收集键名后统一unset()
json_decode() 后数组变成对象?
json_decode() 默认返回 stdClass 对象,不是数组。这是最常被忽略的转换起点错误。
- 强制转关联数组:第二个参数设为
true——json_decode($json, true) - 检查结果类型:
is_array(json_decode($json, true))比is_object()更可靠 - 如果原始 JSON 里有重复键(如两个
"id"),PHP 会静默覆盖,只保留最后一个,这种丢失不会报错,只能靠json_last_error()排查语法问题,无法捕获逻辑错误
调试数组转换的核心不是“看到什么”,而是“确认类型、键型、编码、可变性”四个点。少依赖直觉,多打一行 gettype() 或 json_last_error_msg(),比反复重写逻辑更快。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











