如何从PHP中的多维关联数组中删除项目

恩德雷·奥特姆(Endre Ottem)

我有一个多维的关联数组。我试图找到一种方法,从数组中删除特殊项目,无论它们的位置如何。

该数组用于在网站上构建导航菜单。子项将始终位于其父项中称为“子项”的数组中。如果没有子项,则不会出现关键的“子项”,如果这样会使事情变得更容易。

“ menuid”是数据库中该项目的ID,但是由于存在多种类型的项目(页面,类别页面,图库,URL等),因此相同的menuid可能会出现多次。我希望能够通过“菜单”和“菜单类型”删除项目。

我可以单独基于menuid删除项目,但只能从根数组中删除项目:

$key = array_search(15, array_column($array, 'menuid'));
unset($array[$key]);

我更喜欢用一个函数来做,但是这里我有同样的问题。如果项目位于数组的根目录中,这也将仅将其删除。

function removeItem($array, $menutype, $menuid)
{
   foreach ($array as $key => $value)
   {
      if (is_array($value)) 
      {
         if (isset($value['menutype']) && isset($value['menuid']) && $value['menutype'] == $menutype && $value['menuid'] == $menuid)
         {
            unset($array[$key]);
         }
      }
   }
   return $array;
}

$removeItem = removeItem($array, 'simplepage', 11);

我还没有找到一种基于“ menutype”和“ menuid”从数组中任何地方删除项目的方法。

这是数组的示例。如何删除菜单编号为13且菜单类型为“ posts_category”的项目?

Array
(
    [0] => Array
        (
            [menutarget] => _parent
            [menulink] => /
            [rewritename] => Home
            [menutype] => url
            [menuid] => 2
            [id] => Home
        )

    [1] => Array
        (
            [id] => Category 3
            [menuid] => 15
            [menutype] => posts_category
            [rewritename] => Category_3
            [menulink] => 
            [menutarget] => _parent
        )

    [2] => Array
        (
            [id] => Page 1
            [menuid] => 11
            [menutype] => page
            [rewritename] => page_1
            [menulink] => 
            [menutarget] => _parent
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => Category 1
                            [menuid] => 13
                            [menutype] => posts_category
                            [rewritename] => Category_1
                            [menulink] => 
                            [menutarget] => _parent
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => Category 2
                                            [menuid] => 14
                                            [menutype] => posts_category
                                            [rewritename] => Category_2
                                            [menulink] => 
                                            [menutarget] => _parent
                                        )

                                )

                        )

                )

        )

    [3] => Array
        (
            [menutarget] => _parent
            [menulink] => 
            [rewritename] => Videotest
            [menutype] => page
            [menuid] => 10
            [id] => Videotest
        )
)
HTM地狱

您要递归检查它:

function removeItem(&$array, $menutype, $menuid)
{
    foreach ($array as $key => &$value) {
        if (isset($value['menutype'], $value['menuid']) && $value['menutype'] == $menutype && $value['menuid'] == $menuid) {
            unset($array[$key]);
        } elseif (isset($value['children']) && is_array($value['children'])) {
            removeItem($value['children'], $menutype, $menuid);
        }
    }
}

removeItem($arr, 'posts_category', 13);

print_r($arr);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章