Вернуть значения массива из указанного списка ключей, используя запись через точку в Laravel 5.

Я использую Laravel 5.6. Мне нужна функция, которая возвращает только указанные пары ключ/значение из заданного массива с использованием точечной записи.

Например:

$array = [
    'name' => [
        'first' => 'John', 
        'last' => 'Smith'
    ], 
    'price' => 100,
    'orders' => 10
];


$slice = someFunc($array, ['name.first', 'price']);

должен вернуться:

[
    'name' => [
        'first' => 'John'
    ],
    'price' => 100,
]

Ближайшая функция, которая делает это в Laravel, которую я могу найти, — это функция array_only:

https://laravel.com/docs/5.6/helpers#method-array-only

Однако он не поддерживает запись через точку (в отличие от некоторых других функций Laravel).

Как я могу этого добиться?


person Yahya Uddin    schedule 20.03.2018    source источник
comment
А как насчет array_get?   -  person u_mulder    schedule 20.03.2018
comment
Вы можете комбинировать array_dot и array_only, например: array_only(array_dot($array), ['name.first', 'price']);, и если вам нужно, чтобы это была одна функция, вы можете добавить свой собственный помощник, который обертывает эти две функции.   -  person sam    schedule 20.03.2018
comment
Пробовал $array = collect($array); $array->get('name.first');, но мне прислали null.   -  person Anwar    schedule 20.03.2018
comment
попробуйте это packagist.org/packages/adbario/php-dot-notation   -  person Supun Praneeth    schedule 20.03.2018


Ответы (1)


Есть два варианта, которые вы могли бы использовать с макушки моей головы. Первый — использовать array_dot для сведения многомерного массива в одномерный массив с записью через точку:

$flattened = array_dot([
    'name' => [
        'first' => 'John', 
        'last' => 'Smith'
    ], 
    'price' => 100,
    'orders' => 10
]);

Это даст следующий результат:

[
    'name.first' => 'John',
    'name.last' => 'Smith',
    'price' => 100,
    'orders' => 10,
]

Оттуда вы можете получить все, кроме заказов, используя array_except($flattened, 'orders'). Конечно, результирующий массив все равно будет в точечной записи, что может быть не идеальным для вас.

Второй вариант, который я могу придумать, — это объединение нескольких вызовов array_get, так как он поддерживает запись через точку.

person samrap    schedule 20.03.2018
comment
К сожалению, первый вариант, как вы сказали, помещает все в точечную запись. Хотелось бы в таком же формате. - person Yahya Uddin; 20.03.2018
comment
Взгляните на это: заголовок stackoverflow.com/questions/9635968/ - person samrap; 20.03.2018