Преобразовать многомерный массив в одномерный и получить дочернии категории. PHP
<?php
array (
0 =>
array (
'id' => 1,
'name' => 'Пользователи',
'alias' => 'users',
'childrens' =>
array (
0 =>
array (
'id' => 2,
'name' => 'Создание',
'alias' => 'create',
),
1 =>
array (
'id' => 3,
'name' => 'Список',
'alias' => 'list',
'childrens' =>
array (
0 =>
array (
'id' => 4,
'name' => 'Активные',
'alias' => 'active',
),
1 =>
array (
'id' => 5,
'name' => 'Удаленные',
'alias' => 'deleted',
),
),
),
2 =>
array (
'id' => 8,
'name' => 'Поиск',
'alias' => 'search',
),
),
),
1 =>
array (
'id' => 6,
'name' => 'Заявки',
'alias' => 'requests',
'childrens' =>
array (
0 =>
array (
'id' => 9,
'name' => 'Заявки на поключение',
'alias' => 'connecting',
),
1 =>
array (
'id' => 10,
'name' => 'Заявки на ремонт',
'alias' => 'repairs',
),
2 =>
array (
'id' => 11,
'name' => 'Заявки на обход',
'alias' => 'round',
),
),
),
2 =>
array (
'id' => 7,
'name' => 'Отчёты',
'alias' => 'reports',
'childrens' =>
array (
0 =>
array (
'id' => 12,
'name' => 'Отдел маркетинга',
'alias' => 'marketing',
'childrens' =>
array (
0 =>
array (
'id' => 15,
'name' => 'Отчёт по списаниям',
'alias' => 'write-offs',
),
1 =>
array (
'id' => 16,
'name' => 'Отчёт по расходам',
'alias' => 'costs',
),
2 =>
array (
'id' => 17,
'name' => 'Годовой отчёт',
'alias' => 'year',
),
),
),
1 =>
array (
'id' => 14,
'name' => 'Управление',
'alias' => 'control',
0 =>
array (
0 =>
array (
'id' => 18,
'name' => 'Отчёт по эффективности работы',
'alias' => 'efficiency',
),
1 =>
array (
'id' => 19,
'name' => 'Отчёт по подключениям',
'alias' => 'connecting',
),
),
),
),
),
)
в одномерный. Вот так пробовал -
<?php
$json = file_get_contents("categories.json");
$categories = json_decode($json, true);
foreach ($categories as $category) { //Level 1
$category_id = $category['id'];
$category_name = $category['name'];
$category_alias = $category['alias'];
$category_child = $category['childrens'];
foreach ($category_child as $child) { //Level 2
$child_new_data = $child['childrens'];
if ($child_new_data !== NULL) {
foreach ($child_new_data as $child_new) { //Level 3
}
}
else{
if ($child[0] !== NULL) {
foreach ($child[0] as $child_3) {
};
}
}
}
}
но не могу сообразить что дальше делать... Нужно получить вот такой массив
array(4) {
["id"]=>
int(1)
["name"]=>
string(24) "Пользователи"
["alias"]=>
string(5) "users"
["childrens"]=> "Создание, список, поиск"
}
array(3) {
["id"]=>
int(2)
["name"]=>
string(16) "Создание"
["alias"]=>
string(6) "create"
}
array(4) {
["id"]=>
int(3)
["name"]=>
string(12) "Список"
["alias"]=>
string(4) "list"
["childrens"]=> "Активные, удаленные"
}
для того что бы записать в бд. Тут нужна рекурсия? Не совсем понимаю просто
Ответы (1 шт):
Автор решения: ordman
→ Ссылка
<?php
$arr = array (
0 =>
array (
'id' => 1,
'name' => 'Пользователи',
'alias' => 'users',
'childrens' =>
array (
0 =>
array (
'id' => 2,
'name' => 'Создание',
'alias' => 'create',
),
1 =>
array (
'id' => 3,
'name' => 'Список',
'alias' => 'list',
'childrens' =>
array (
0 =>
array (
'id' => 4,
'name' => 'Активные',
'alias' => 'active',
),
1 =>
array (
'id' => 5,
'name' => 'Удаленные',
'alias' => 'deleted',
),
),
),
2 =>
array (
'id' => 8,
'name' => 'Поиск',
'alias' => 'search',
),
),
),
1 =>
array (
'id' => 6,
'name' => 'Заявки',
'alias' => 'requests',
'childrens' =>
array (
0 =>
array (
'id' => 9,
'name' => 'Заявки на поключение',
'alias' => 'connecting',
),
1 =>
array (
'id' => 10,
'name' => 'Заявки на ремонт',
'alias' => 'repairs',
),
2 =>
array (
'id' => 11,
'name' => 'Заявки на обход',
'alias' => 'round',
),
),
),
2 =>
array (
'id' => 7,
'name' => 'Отчёты',
'alias' => 'reports',
'childrens' =>
array (
0 =>
array (
'id' => 12,
'name' => 'Отдел маркетинга',
'alias' => 'marketing',
'childrens' =>
array (
0 =>
array (
'id' => 15,
'name' => 'Отчёт по списаниям',
'alias' => 'write-offs',
),
1 =>
array (
'id' => 16,
'name' => 'Отчёт по расходам',
'alias' => 'costs',
),
2 =>
array (
'id' => 17,
'name' => 'Годовой отчёт',
'alias' => 'year',
),
),
),
1 =>
array (
'id' => 14,
'name' => 'Управление',
'alias' => 'control',
0 =>
array (
0 =>
array (
'id' => 18,
'name' => 'Отчёт по эффективности работы',
'alias' => 'efficiency',
),
1 =>
array (
'id' => 19,
'name' => 'Отчёт по подключениям',
'alias' => 'connecting',
),
),
),
),
),
);
function flatten($arr)
{
$ret = [];
foreach ($arr as $item) {
$tmp = ['id' => $item['id'], 'name' => $item['name'], 'alias' => $item['alias'], ];
$hasChildren = array_key_exists('childrens', $item);
if ($hasChildren) {
$tmp['childrens'] = array_reduce(
$item['childrens'],
function ($prev, $_item) {return ltrim($prev . ', ' . $_item['name'], ', ');},
''
);
}
$ret[] = $tmp;
if ($hasChildren) {
$ret = array_merge($ret, flatten($item['childrens']));
}
}
return $ret;
}
var_dump(flatten($arr));