連想配列をドット表記で flatten する
Laravel の Arr::dot() とほぼ同じ.
当該メソッドは
code:php
public static function dot($array, $prepend = '')
{
$results = [];
foreach ($array as $key => $value) {
if (is_array($value) && ! empty($value)) {
$results = array_merge($results, static::dot($value, $prepend.$key.'.'));
} else {
}
}
return $results;
}
これをちょっと書き換えて
code:php
function dot(array $array, string $prepend = ''): Generator
{
foreach ($array as $k => $v) {
if (is_array($v) && !empty($v)) {
yield from dot($v, $prepend.$k.'.');
} else {
yield $prepend.$k => $v;
}
}
}
使う方は iterator_to_array が必要だけど,ちょっとすっきり.
iterator_to_array まで内包するなら,
code:php
function dot(array $array): array
{
return iterator_to_array(($inner = function (array $array, string $prepend = '') use (&$inner) {
foreach ($array as $k => $v) {
if (is_array($v) && !empty($v)) {
yield from $inner($v, $prepend.$k.'.');
} else {
yield $prepend.$k => $v;
}
}
})($array));
}
とできるけど,これだったら多分Laravelのヤツのほうが分かりやすいw