循环多维数组并删除某些键

2023-12-05

我有一个基于下面数组的嵌套树结构:



Array
(
    [1] => Array
        (
            [id] => 1
            [parent] => 0
            [name] => Startpage
            [uri] => 125
            [basename] => index.php
            [child] => 
        )

    [23] => Array
        (
            [id] => 23
            [parent] => 0
            [name] => Events
            [uri] => 0
            [basename] => 
            [child] => Array
                (
                    [24] => Array
                        (
                            [id] => 24
                            [parent] => 23
                            [name] => Public news
                            [uri] => 0
                            [basename] => 
                            [child] => Array
                                (
                                    [27] => Array
                                        (
                                            [id] => 27
                                            [parent] => 24
                                            [name] => Add
                                            [uri] => 100
                                            [basename] => news.public.add.php
                                            [child] => 
                                        )

                                    [28] => Array
                                        (
                                            [id] => 28
                                            [parent] => 24
                                            [name] => Overview
                                            [uri] => 101
                                            [basename] => news.public.overview.php
                                            [child] => 
                                        )

                                )

                        )

                    [25] => Array
                        (
                            [id] => 25
                            [parent] => 23
                            [name] => Private news
                            [uri] => 0
                            [basename] => 
                            [child] => Array
                                (
                                    [29] => Array
                                        (
                                            [id] => 29
                                            [parent] => 25
                                            [name] => Add
                                            [uri] => 67
                                            [basename] => news.private.add.php
                                            [child] => 
                                        )

                                    [30] => Array
                                        (
                                            [id] => 30
                                            [parent] => 25
                                            [name] => Overview
                                            [uri] => 68
                                            [basename] => news.private.overview.php
                                            [child] => 
                                        )

                                )

                        )

                    [26] => Array
                        (
                            [id] => 26
                            [parent] => 23
                            [name] => Calendar
                            [uri] => 0
                            [basename] => 
                            [child] => Array
                                (
                                    [31] => Array
                                        (
                                            [id] => 31
                                            [parent] => 26
                                            [name] => Add
                                            [uri] => 69
                                            [basename] => news.event.add.php
                                            [child] => 
                                        )

                                    [32] => Array
                                        (
                                            [id] => 32
                                            [parent] => 26
                                            [name] => Overview
                                            [uri] => 70
                                            [basename] => news.event.overview.php
                                            [child] => 
                                        )

                                )

                        )

                )

        )
)  

我正在寻找一个函数来循环(递归?)数组并删除一些键。

在我的系统中,我可以允许用户访问某些功能/页面,如果我拒绝访问整个“块”“事件”,则数组将如下所示:


array (
  1 => 
  array (
    'id' => '1',
    'parent' => '0',
    'name' => 'Start page',
    'uri' => '125',
    'basename' => 'index.php',
    'child' => '',
  ),
  23 => 
  array (
    'id' => '23',
    'parent' => '0',
    'name' => 'Events',
    'uri' => '0',
    'basename' => NULL,
    'child' => 
    array (
      24 => 
      array (
        'id' => '24',
        'parent' => '23',
        'name' => 'Public news',
        'uri' => '0',
        'basename' => NULL,
        'child' => '',
      ),
      25 => 
      array (
        'id' => '25',
        'parent' => '23',
        'name' => 'Private news',
        'uri' => '0',
        'basename' => NULL,
        'child' => '',
      ),
      26 => 
      array (
        'id' => '26',
        'parent' => '23',
        'name' => 'Calendar',
        'uri' => '0',
        'basename' => NULL,
        'child' => '',
      ),
    ),
  )
)  

正如您在上面看到的,整个“块”“事件”现在毫无用处,因为没有与每个选项关联的页面。因此,我需要找到“basename”为空且 child 不是数组或数组为空的所有“键”并删除它们。 我在搜索网站时发现了这个功能:

function searchAndDestroy(&$a, $key, $val){
    foreach($a as $k => &$v){
        if(is_array($v)){
            $r = searchAndDestroy($v, $key, $val);
            if($r) {
                unset($a[$k]);
            }
        } elseif ($key == $k && $val == $v) {
            return true;
        }
    }
    return false;
}

它可用于删除数组中任何位置的键,但仅基于一件事,例如删除“parent”等于“23”的所有键。但我需要找到并删除(取消设置)“basename”为空且 child 不是数组或数组为空的所有键。 任何人都可以帮助我并可能调整上面的功能吗?

谢谢你,


不要在搜索函数中测试要销毁哪些元素,而是传递一个函数来测试目标。

function searchAndDestroy(&$a, $targetp){
    foreach($a as $k => &$v){
        if(is_array($v)){
            searchAndDestroy($v, $targetp);
        } 
        if ($targetp($k, $v)) {
            unset($a[$k]);
        }
    }
}

searchAndDestroy($menu, function ($k, $v) {
        return is_array($v) 
            && array_key_exists('basename', $v) && empty($v['basename'])
            && (empty($v['child']) || count($v['child']) == 0);
    });

对于 PHP searchAndDestroy该函数位于多个位置),命名该函数并传递该名称而不是匿名函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

循环多维数组并删除某些键 的相关文章

随机推荐

  • 如何在XML中使用外部实体?

    我试图了解如何使用外部实体 但我遗漏了一些东西 我有第一个文件 测试实体 xml
  • Node.js readFileSync ZIP 文件

    我正在尝试读取 ZIP 文件并将其输出到浏览器 获取页面上显示的代码并将其另存为 ZIP 文件 fs readFileSync dir file zip utf 8 当我这样做时 我得到的输出以PK coG filename txt并持续一
  • ASP.NET MVC:使用 JsonResult 控制属性名称的序列化

    有没有办法控制 JSON 输出JsonResult具有属性 类似于您可以使用的方式XmlElementAttribute及其兄弟来控制 XML 序列化的输出 例如 给定以下类 public class Foo SomeJsonSeriali
  • MySQL:带有 ORDER BY COUNT 的 GROUP_CONCAT?

    这可能吗 假设我有一个地址列表 其中有很多重复的条目 我需要过滤掉所有重复项 因为有些地址的名称略有不同 但邮政编码和电话号码相同 首先 我对邮政编码和电话进行 GROUP BY SELECT name address postalcode
  • 如何使用 AWS Cloudformer 为现有 API 网关创建云形成模板?

    我已经使用 aws 控制台创建了一个 api 网关 我想使用以下方法为我的 api 网关生成 CloudFormation 模板云形成者 请帮忙 尽管 AWS 尚未发布官方声明 但 CloudFormer 似乎已终止生命周期 AWS 没有正
  • 使用正则表达式匹配编辑(重新编码、折叠、排序)因子级别

    我发现在 R 中操作因子变量过于复杂 清洁因素时我经常想做的事情包括 排序级别 不仅设置参考类别 而且将所有级别按逻辑 非字母顺序 排列为汇总表 x lt factor x levels new order 重新编码 重命名因子级别 简化名
  • iOS 中 NSOperation 和 NSOperationQueue 的后台任务

    我想上传一些文件 即使应用程序进入后台 这些文件也应该继续 目前 我正在从数据库检索文件 然后通过 NSOperation 将其添加到队列中 然后启动上传过程 即使应用程序进入后台或前台 也应上传所有文件 下面是单个任务的代码 任何人都可以
  • 如何找到 log4j 默认初始化中使用的 URL?

    Log4j默认初始化通过一个过程来查找并使用 URL 进行配置 之后 您如何才能找出最终使用的 URL 而无需自己编写相同的过程 如果您必须自己编写代码 您可能不会得到与 log4j 完全相同的结果 而且它可能会在未来的版本中发生变化 如果
  • 如何使用 Rails 发送电子邮件

    这可能非常直接和简单 但我是 ruby on Rails 的新手和菜鸟 我有一个简单的电子邮件 php 脚本 我在旧网站上使用过 但现在由于我已经转换为 Rails 我不确定如何创建与之等效的脚本 我尝试使用rails generate m
  • 为什么 echo 与 printf 结合显示错误的输出? [复制]

    这个问题在这里已经有答案了 有谁知道为什么当我执行此操作时 usr bin php 我明白了 1005 1005 1005 1005 1005 1005 你在混合echo and printf printf返回格式化字符串的长度 所以你的e
  • django-nonrel 和管理页面

    我正在尝试在 AppEngine 上为我的网站设置 Django 管理套件 但它不起作用 我正在使用 django nonrel 设置与 我网站的其余部分似乎工作正常 但我需要让管理员工作 以便我可以开始使用数据存储区 这是我得到的错误 D
  • 格式化 Emacs 函数中的标头以将缓冲区打印到 PDF(带换行)

    Rupert Swarbrick 提出了以下三个函数来将 Emacs 缓冲区打印为 pdf 其中行被换行 使用时通常不会出现这种情况 ps print 功能 问题是这个函数要实现换行 必须复制当前缓冲区 这有效地破坏了ps print bu
  • 使用C将exec进程发送到后台?

    我的问题听起来与此相同 但事实并非如此 在Linux中用C在后台启动一个进程 我知道如何执行 fork 但不知道如何将进程发送到后台 我的程序应该像一个简单的命令 unix shell 一样工作 支持管道和后台进程 我可以做管道和叉子 但我
  • Selenium WebDriver 获取文本

    我有一个 div 0 div 我尝试编写 myDiv 的测试0其中的文字 使用 WebDriver 是 String text webDriver findElement By xpath div name myDiv getText 但在
  • 通过单点登录进行身份验证后移至 Facebook 应用程序页面

    我正在开发一个应用程序 需要集成 Facebook 的社交功能 我想要的是使用 SSO 单点登录 功能 当用户按下我的应用程序中的按钮时 网络视图将打开并向他显示我在 Facebook 中的应用程序页面 在用户进行身份验证后 现在他可以像其
  • React WebApp 调用 NestJS 后端中使用 PassportStrategy 的 Google 登录无法正常工作

    我已经在 NestJS 后端中使用 PassportStrategy 实现了 Google 登录 NestJS 后端开发基于此指南 https medium com nielsmeima auth in nest js and angula
  • 类中ShouldSerialize()的重构...我可以使用IContractResolver吗?

    我有一个返回大量汽车功能的 API 全部都是布尔值或整数 基本上我只想显示返回真值或整数 gt 0 的 API 我正在使用 JSON net 因此我可以使用 ShouldSerialize 属性来确定是否应该根据属性的值序列化该属性 我的代
  • Django cookie 没有保存在浏览器上

    我正在使用 React 和 Django 制作一个应用程序 当我使用 django 登录时 我在 cookie 中设置了令牌 但浏览器中未设置 Django 响应 cookie 我试图努力调试它但不能 不知道我哪里做错了 Request U
  • 如何在 jQuery UI Slider 设置 3 种不同的颜色

    我正在用这个用户界面滑块 我必须用 3 种不同的颜色来制作这个滑块 手柄颜色 句柄的前一部分 句柄的下一部分 Something like this 到目前为止 我只能设置手柄颜色 但是 如何设置另外两种不同的颜色 一个用于手柄的前一部分
  • 循环多维数组并删除某些键

    我有一个基于下面数组的嵌套树结构 Array 1 gt Array id gt 1 parent gt 0 name gt Startpage uri gt 125 basename gt index php child gt 23 gt