#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;
}
Вы можете видеть, как он работает здесь.