print_r适合快速查看二维数组结构,但缺失类型信息且会移动数组指针;var_dump精准显示类型与长度,适合排查类型问题;var_export生成可复用的php语法代码。

print_r 输出二维数组时结构易读但类型信息缺失
当你只想快速确认二维数组的键值嵌套关系、内容是否符合预期,print_r 是最轻量的选择。它用缩进+括号层级展示嵌套,比如 Array ( [0] => Array ( [name] => Tom [age] => 25 ) ),一眼能看清“第0个元素是个数组,里面含 name 和 age”。但它不标类型:字符串和整数都只写值,true 变成空行,null 也只输出换行,容易误判。
注意两个实际坑点:
-
print_r会把数组内部指针移到末尾,后续再用foreach或current()可能取不到第一个元素,调试完记得加reset($arr) - 直接输出到 HTML 页面时,换行和空格会被浏览器合并,源码里看才清晰;想在网页上可读,得包一层
<pre class="brush:php;toolbar:false;"></pre>
var_dump 显示二维数组的完整类型与长度,适合精准排查
遇到“为什么这个字段没显示?”“明明传了字符串,怎么变 int 了?”这类问题,必须用 var_dump。它对二维数组每个元素都标注类型和长度,例如 'name' => string 'Tom' (length=3)、'age' => int 25,连布尔值 bool(true) 和资源句柄 resource(5, stream) 都不放过。
常见使用场景:
- 检查 API 返回的 JSON 解码结果是否真为数组(而非
null或false) - 确认多维数组中某层是否意外为空数组
array(0) { }而非null - 发现键名被自动转成数字(比如
'01'变成int(1)),这在表单提交或 JSON 解析时很常见
二维数组调试时别忽略输出位置和上下文
print_r 和 var_dump 的输出行为本身不区分维度,真正影响可读性的是你调用的位置和方式:
- 在 CLI 环境下,两者都天然带格式缩进,
var_dump的括号层级更严谨;但在浏览器中,必须用<pre class="brush:php;toolbar:false;"><code>var_dump($arr)</code></pre>包裹,否则全挤成一行 - 如果二维数组某层包含对象或资源(如 PDOStatement、cURL 句柄),
print_r可能只显示Object或Resource id #7,而var_dump至少给出资源类型(resource(3, mysql link)) - 调试循环内数组变化时,别只打最后一步——在
for或foreach中每轮都var_dump($row),比看最终结果更有价值
复杂嵌套或需复现数据时,var_export 更实用
当你要把二维数组内容复制回代码做测试用例,或者存成配置文件,var_export 比 print_r 和 var_dump 更直接。它输出的是合法 PHP 语法,比如 array (0 => 'a', 1 => array ('x' => 1)),粘贴过去就能当变量赋值。
但要注意限制:
-
var_export不支持资源(返回NULL)和含循环引用的数组(如$arr['self'] = &$arr),会报错;var_dump则能安全处理 - 它默认不输出类型提示,无法替代
var_dump做类型校验 - 若要捕获输出,必须传第二个参数
true:$str = var_export($arr, true)
print_r,类型确诊用 var_dump,复现数据用 var_export。最容易被忽略的是输出环境适配——忘了加 <pre class="brush:php;toolbar:false;"></pre> 导致浏览器里一团乱麻,或者在 CLI 里用 print_r 却没注意到布尔值根本没输出。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











