Я использую 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).
Как я могу этого добиться?
Вы можете комбинировать array_dot и array_only, например: array_only(array_dot($array), ['name.first', 'price']);, и если вам нужно, чтобы это была одна функция, вы можете добавить свой собственный помощник, который обертывает эти две функции.
Пробовал $array = collect($array); $array->get('name.first');, но он мне приходит null.
попробуйте это packagist.org/packages/adbario/php-dot-notation






Есть два варианта, которые вы могли бы использовать сразу же. Первый - использовать 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, поскольку он поддерживает точечную нотацию.
К сожалению, первый вариант, как вы сказали, помещает все в точечную нотацию. Хотелось бы, чтобы он был в таком же формате.
Взгляните на это: stackoverflow.com/questions/9635968/…
А как насчет
array_get?