Php 组合多个多维数组

Php 组合多个多维数组,php,Php,我有一套菜单项,如下所示: [ [ "cat" => [ "subcat" => [ "subsubcat1" => $item]]], [ "cat" => [ "subcat" => [ "subsubcat2" => $item2]]], [ "cat" => [ "subcat2" => [ "subsubcat3" => $item3]]], [ "cat" => [ "subcat2" =&g

我有一套菜单项,如下所示:

[
    [ "cat" => [ "subcat" => [ "subsubcat1" => $item]]],
    [ "cat" => [ "subcat" => [ "subsubcat2" => $item2]]],
    [ "cat" => [ "subcat2" => [ "subsubcat3" => $item3]]],
    [ "cat" => [ "subcat2" => [ "subsubcat3" => $item4]]],
    [ "cat2" => [ "subcat2" => [ "subsubcat3" => $item5]]],
];
[ 
    "cat" =>
    [
        "subcat" => [
            "subsubcat1" => [ $item ],
            "subsubcat2" => [ $item2 ],
        ],
        "subcat2" => [
            "subsubcat3" => [ $item3, $item4 ]
        ]
    ], 
    "cat2" => [
        "subcat2" => [
            "subsubcat3" => [ $item5 ]
        ]
    ]
];
<menu>
    <category id="cat">
        <category id="subcat2">
            <category id="subsubcat1">
                <menuitem name="{ $item['title'] }" />
            </category>
         </category>
        [...]
   </category>
</menu>
$menu = [];

foreach ($initial as $item) {
   addItem($item, $menu);
}
我希望将它们结合起来,如下所示:

[
    [ "cat" => [ "subcat" => [ "subsubcat1" => $item]]],
    [ "cat" => [ "subcat" => [ "subsubcat2" => $item2]]],
    [ "cat" => [ "subcat2" => [ "subsubcat3" => $item3]]],
    [ "cat" => [ "subcat2" => [ "subsubcat3" => $item4]]],
    [ "cat2" => [ "subcat2" => [ "subsubcat3" => $item5]]],
];
[ 
    "cat" =>
    [
        "subcat" => [
            "subsubcat1" => [ $item ],
            "subsubcat2" => [ $item2 ],
        ],
        "subcat2" => [
            "subsubcat3" => [ $item3, $item4 ]
        ]
    ], 
    "cat2" => [
        "subcat2" => [
            "subsubcat3" => [ $item5 ]
        ]
    ]
];
<menu>
    <category id="cat">
        <category id="subcat2">
            <category id="subsubcat1">
                <menuitem name="{ $item['title'] }" />
            </category>
         </category>
        [...]
   </category>
</menu>
$menu = [];

foreach ($initial as $item) {
   addItem($item, $menu);
}
因此,我可以生成如下xml结构:

[
    [ "cat" => [ "subcat" => [ "subsubcat1" => $item]]],
    [ "cat" => [ "subcat" => [ "subsubcat2" => $item2]]],
    [ "cat" => [ "subcat2" => [ "subsubcat3" => $item3]]],
    [ "cat" => [ "subcat2" => [ "subsubcat3" => $item4]]],
    [ "cat2" => [ "subcat2" => [ "subsubcat3" => $item5]]],
];
[ 
    "cat" =>
    [
        "subcat" => [
            "subsubcat1" => [ $item ],
            "subsubcat2" => [ $item2 ],
        ],
        "subcat2" => [
            "subsubcat3" => [ $item3, $item4 ]
        ]
    ], 
    "cat2" => [
        "subcat2" => [
            "subsubcat3" => [ $item5 ]
        ]
    ]
];
<menu>
    <category id="cat">
        <category id="subcat2">
            <category id="subsubcat1">
                <menuitem name="{ $item['title'] }" />
            </category>
         </category>
        [...]
   </category>
</menu>
$menu = [];

foreach ($initial as $item) {
   addItem($item, $menu);
}
也许使用DOM可以省略第二步,但我无法理解这一点。我尝试了array\u merge\u recursive…$items,但这也会分散$items


如果最后一个值是最后一个嵌套数组的值,那么在这种情况下,如何合并这些多维数组?在这种情况下,键可以被覆盖,没有重复的subcat2,除非父项不同,但最后一个数组$item、$item2等中的值需要追加。

这是一个递归函数,将添加具有该结构的项

function addItem($item, &$category) {
   if (!is_array($item)) {
      $category[] = $item;
   } else {
      $value = reset($item);
      $key = key($item);
      addItem($value, $category[$key]);
   }
}
可以将其应用于外部阵列,如下所示:

[
    [ "cat" => [ "subcat" => [ "subsubcat1" => $item]]],
    [ "cat" => [ "subcat" => [ "subsubcat2" => $item2]]],
    [ "cat" => [ "subcat2" => [ "subsubcat3" => $item3]]],
    [ "cat" => [ "subcat2" => [ "subsubcat3" => $item4]]],
    [ "cat2" => [ "subcat2" => [ "subsubcat3" => $item5]]],
];
[ 
    "cat" =>
    [
        "subcat" => [
            "subsubcat1" => [ $item ],
            "subsubcat2" => [ $item2 ],
        ],
        "subcat2" => [
            "subsubcat3" => [ $item3, $item4 ]
        ]
    ], 
    "cat2" => [
        "subcat2" => [
            "subsubcat3" => [ $item5 ]
        ]
    ]
];
<menu>
    <category id="cat">
        <category id="subcat2">
            <category id="subsubcat1">
                <menuitem name="{ $item['title'] }" />
            </category>
         </category>
        [...]
   </category>
</menu>
$menu = [];

foreach ($initial as $item) {
   addItem($item, $menu);
}