Laravel有一个帮助程序,它使您只能像这样获得所需的键:
https://laravel.com/docs/5.6/helpers#method-array-only
$array = ['name' => 'Desk', 'price' => 100, 'orders' => 10];
$slice = array_only($array, ['name', 'price']);
// ['name' => 'Desk', 'price' => 100]
但是,我如何获得也可以使用点表示法的array_only
等价物。例如
$array = [
'name' => [
'first' => 'John',
'last' => 'Smith',
],
'levels' => [
'maths' => 6,
'science' => 10,
],
'age' => 25,
];
$slice = array_dot_only($array, ['name.first', 'levels']);
/*
[
'name' => [
'first' => 'John',
],
'levels' => [
'maths' => 6,
'science' => 10,
],
];
*/
答案 0 :(得分:2)
Laravel使用预先支持点标记的助手array_set和array_get使此操作变得容易。
function array_dot_only($array, $keys) {
$newArray = [];
foreach((array) $keys as $key) {
array_set($newArray, $key, array_get($array, $key));
}
return $newArray;
}
答案 1 :(得分:2)
以@Edwin的答案为基础:
function array_dot_only(array $array, $keys): array
{
$newArray = [];
$default = new stdClass;
foreach ((array)$keys as $key) {
$value = array_get($array, $key, $default);
if ($value !== $default) {
array_set($newArray, $key, $value);
}
}
return $newArray;
}
这使函数更接近array_only
,因为它将包括设置了键但值为空的项。通过使用一个对象作为默认对象并检查$value
是否是同一对象来实现。
答案 2 :(得分:0)
这里是@Devon答案的略微修改:
function array_dot_only(array $array, $keys): array
{
$newArray = [];
foreach ((array)$keys as $key) {
$value = array_get($array, $key);
if (isset($value)) {
array_set($newArray, $key, $value);
}
}
return $newArray;
}
此更改将使其行为与array_only()
更加一致,因为array_only()
不会插入源$array
中不存在的字段。