PHP原生无Arr类,Laravel的Arr需引入illuminate/support;Arr::get()通过递归校验避免undefined index错误,支持点号/中括号路径;Arr::wrap()/unwrap()用于统一输入类型;高频调用应预处理;跨版本需确认illuminate/support版本。

PHP 原生不提供 Arr 类;Laravel 的 Arr 是框架内置的静态工具类,不能直接在纯 PHP 项目中用——必须引入 Laravel 的 illuminate/support 包,或手动复制其源码逻辑。
为什么 Arr::get() 比原生 isset() + 三元更安全
深层嵌套数组取值时,原生写法容易触发 Notice: Undefined index 或 Fatal error: Cannot use a scalar value as an array。而 Arr::get($array, 'users.0.name', 'N/A') 内部做了递归键检查和类型校验,自动跳过非数组层级。
- 支持点号(
.)和中括号([0][name])两种路径语法 - 当路径中间某层是
null或字符串等标量时,直接返回默认值,不报错 - 注意:
Arr::get()不支持动态变量插值,比如Arr::get($arr, "items.{$i}.id")要先拼好字符串再传入
Arr::wrap() 和 Arr::unwrap() 的真实用途
这两个函数不是“加壳/去壳”玩具,而是为统一输入类型设计的防御性操作:
-
Arr::wrap(null)→[];Arr::wrap('hello')→['hello'];Arr::wrap([1,2])→[1,2] -
Arr::unwrap(['single'])→'single';但Arr::unwrap([1,2])→[1,2](长度 ≠ 1 时不拆) - 典型场景:API 接收参数时,前端可能传
"tags": "php"或"tags": ["php", "laravel"],用Arr::wrap($request->input('tags'))可统一成数组处理
别在循环里反复调用 Arr::has() 或 Arr::only()
这两个函数内部都会遍历整个键路径或键列表,性能开销不可忽视。高频场景下建议预处理:
立即学习“PHP免费学习笔记(深入)”;
- 用
Arr::has($data, ['user.name', 'user.email'])代替多次单键判断 - 若需多次提取相同字段,先
$subset = Arr::only($data, ['id', 'title', 'slug']),后续直接操作$subset - 注意:
Arr::only()对缺失键静默忽略,不会补null;如需补空值,得自己用array_merge()配合默认数组
真正麻烦的是跨版本兼容——Laravel 9+ 的 Arr 新增了 Arr::toCssClasses() 和 Arr::isAssoc(),但老项目若混用 laravel/framework 和独立 illuminate/support,可能因版本错位导致方法不存在。动手前先 composer show illuminate/support 确认版本,比猜更省时间。



















