Laravel array_only带点表示法

时间:2018-09-05 22:31:05

标签: php arrays laravel laravel-5

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,
    ],
];
*/

3 个答案:

答案 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中不存在的字段。