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

Posted

技术标签:

【中文标题】如何从 PHP 中的多维关联数组中删除项目【英文标题】:How to remove item from multidimensional, associative array in PHP 【发布时间】:2021-04-24 04:48:56 【问题描述】:

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

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

“menuid”是item在数据库中的id,但是由于item有多种类型(pages、category pages、gallery、urls等),同一个menuid可能会出现多次。我希望能够通过“menuid”和“menutype”删除项目。

我可以仅根据 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”从数组中的任何位置删除项目。

这是数组的一个示例。我该怎么做才能删除 menuid 13 和 menutype "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
        )
)

【问题讨论】:

【参考方案1】:

你想递归检查它:

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);

【讨论】:

以上是关于如何从 PHP 中的多维关联数组中删除项目的主要内容,如果未能解决你的问题,请参考以下文章

C# 中的多维关联数组

如何循环访问和访问多维和关联数组中的各种元素? PHP,JSON 或 XML

PHP填充多维关联数组 - 最简单的方法

php 数组索引值如何重新从0开始递增

如何检查多维关联数组中的重复值?

php多维数组自定义排序 uasort()