Laravel 5.6如何使用点语法从数组提取指定键值对
实现支持点语法的数组切片函数(Laravel 5.6)
嘿,我刚好碰到过类似的需求!Laravel自带的array_only确实没办法处理嵌套结构的点语法,不过咱们可以用框架现成的辅助函数快速封装一个符合你要求的函数,完全不用自己写复杂的递归逻辑。
下面是具体的实现代码:
function someFunc(array $array, array $keys) { $result = []; foreach ($keys as $key) { // 用Laravel的data_get通过点语法取出对应值 $value = data_get($array, $key); // 如果值存在就把它按路径设置到结果数组里(想保留null的话可以去掉这个判断) if (!is_null($value)) { array_set($result, $key, $value); } } return $result; }
用法示例
完全按照你给出的例子调用就行:
$array = [ 'name' => [ 'first' => 'John', 'last' => 'Smith' ], 'price' => 100, 'orders' => 10 ]; $slice = someFunc($array, ['name.first', 'price']); // 返回的结果就是你想要的: // [ 'name' => [ 'first' => 'John' ], 'price' => 100 ]
原理说明
data_get是Laravel内置的辅助函数,专门用来处理数组/对象的嵌套取值,完美支持点语法,就算路径不存在也不会报错(默认返回null)。array_set同样是框架自带的工具,能自动根据点语法的路径创建嵌套数组层级,把值精准设置到对应的位置上,省了我们自己写递归的麻烦。
要是你的项目里没自动加载这些辅助函数(不过Laravel默认是全局加载的),也可以直接引入Illuminate\Support\Arr类,用静态方法调用:Arr::get()和Arr::set(),效果完全一样。
内容的提问来源于stack exchange,提问作者Yahya Uddin
相关产品推荐
相关产品推荐

