我想从我的php数组创建一个n级菜单数组。可以有n级孩子。主阵列将是相同的意味着不是多维n级数组。我提供了一个满足我正在使用的数组结构的示例数组。
$menu_array =
Array
(
[menu-main] => Array
(
[menu_name] => Menu Name 1
[menu_slug] => menu-main
[parent_menu_slug] =>
)
[menu-sub-main] => Array
(
[menu_name] => Sub Menu 1
[menu_slug] => menu-sub-main
[parent_menu_slug] => menu-main
)
[menu-sub-sub-main] => Array
(
[menu_name] => Sub Sub Menu 1
[menu_slug] => menu-sub-sub-main
[parent_menu_slug] => menu-sub-main
)
[menu-main1] => Array
(
[menu_name] => Menu Name 1
[menu_slug] => menu-main1
[parent_menu_slug] =>
)
)
我想创建n级数组以从此数组生成菜单。为此,我尝试了下面的
$x = [];
$tmp = array_combine(array_column($menu_array,'menu_slug'), $menu_array);
//parent menus only
foreach ($tmp as $k => $t) {
if (empty($t['parent_menu_slug'])) {
$x[$t['menu_slug']] = $t;
unset($tmp[$k]);
}
}
$d = [];
$rec_fn = function ($temp,$parent_slug = '') use (&$rec_fn,$x,&$d) {
if ($parent_slug && array_key_exists($parent_slug,$x)) {
$d[$parent_slug]['children'][] = $temp;
} else {
foreach ($temp as $c) {
if (!empty($c['parent_menu_slug'])) {
$d['children'][] = $rec_fn($c,$c['parent_menu_slug']);
}
}
}
return $d;
};
$final_menu = $rec_fn($tmp);
但它没有返回所需的结果。所需的结果是
Array
(
[menu-main] => Array
(
[menu_name] => Menu Name 1
[menu_slug] => menu-main
[parent_menu_slug] =>
[children] => array(
[menu-sub-main] => Array
(
[menu_name] => Sub Menu 1
[menu_slug] => menu-sub-main
[parent_menu_slug] => menu-main
[children] => array(
[menu-sub-sub-main] => Array
(
[menu_name] => Sub Sub Menu 1
[menu_slug] => menu-sub-sub-main
[parent_menu_slug] => menu-sub-main
)
.
.
)
)
.
.
)
)
[menu-main1] => Array
(
[menu_name] => Menu Name 1
[menu_slug] => menu-main1
[parent_menu_slug] =>
)
..
)
任何帮助将不胜感激
答案 0 :(得分:1)
来自link
我已根据要求更改了一些函数参数,并获得了确切的输出,我更改了分支线。
这是实现此目的的递归函数,
function buildTree(array $elements, $options = [
'parent_id_column_name' => 'parent_menu_slug',
'children_key_name' => 'children',
'id_column_name' => 'menu_slug'], $parentId = '')
{
$branch = array();
foreach ($elements as $element) {
if ($element[$options['parent_id_column_name']] == $parentId) {
// we will call for every node which is having its child using recursion
$children = buildTree($elements, $options, $element[$options['id_column_name']]);
if ($children) { // if it have children array then save it
$element[$options['children_key_name']] = $children;
}
// we will save every node's parent generated recursive data here
$branch[$element['menu_slug']] = $element; // I changed this line
}
}
// recursive generated data returned
return $branch;
}
以下是demo。