Laravel has a helper that allows you to get only the keys you want like so:
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]
However, how can I get the array_only
equivalent that also allows dot notation. e.g.
$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, ], ]; */
Advertisement
Answer
Building off @Edwin’s answer:
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; }
This brings the function even closer to array_only
because it will include items where the key is set but the value is null. It does so by using an object as the default and checking if the $value
is that same object.