PHP Создает список крошек каждого значения во вложенном массиве

#php #arrays #multidimensional-array

Вопрос:

У меня есть массив, который выглядит следующим образом:

 [
    'applicant' => [
        'user' => [
            'username' => true,
            'password' => true,
            'data' => [
                'value' => true,
                'anotherValue' => true
            ]
        ]
    ]
]
 

Что я хочу сделать, так это преобразовать этот массив в массив, который выглядит так:

 [
    'applicant.user.username',
    'applicant.user.password',
    'applicant.user.data.value',
    'applicant.user.data.anotherValue'
]
 

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

Только ключи со true значением являются конечными узлами, каждый второй узел всегда будет массивом. Как бы я справился с этим?

Редактировать

Это то, что я пробовал до сих пор, но не дает желаемых результатов:

     $tree = $this->getTree(); // Returns the above nested array
    $crumbs = [];

    $recurse = function ($tree, amp;$currentTree = []) use (amp;$recurse, amp;$crumbs)
    {
        foreach ($tree as $branch => $value)
        {
            if (is_array($value))
            {
                $currentTree[] = $branch;
                $recurse($value, $currentTree);
            }
            else
            {
                $crumbs[] = implode('.', $currentTree);
            }
        }
    };

    $recurse($tree);
 

Комментарии:

1. И то, что вы пробовали до сих пор. Опубликуйте свои попытки тоже..

2. Я опубликовал свою попытку выше

Ответ №1:

Эта функция делает то, что вы хотите:

 function flattenArray($arr) {
    $output = [];

    foreach ($arr as $key => $value) {
        if (is_array($value)) {
            foreach(flattenArray($value) as $flattenKey => $flattenValue) {
                $output["${key}.${flattenKey}"] = $flattenValue;
            }
        } else {
            $output[$key] = $value;
        }
    }

    return $output;
}
 

Вы можете видеть, как он работает здесь.