PHP 中使用数组上的 foreach 循环对父节点和子节点进行排序的递归函数

2023-12-08

我有一个存储在数组中的数据集,该数组使用父子 id 引用自身:id, parent_id, title等等。顶层有一个parent_id of 0,可以有无数的亲子关系。

所以我用一个对这个数组进行排序foreach在递归函数中循环以根据其父元素检查每个数组元素,我想我已经盯着这个方法太久了。

我最终确实以正确的顺序得到了元素,但我似乎无法正确嵌套列表,这让我认为该方法实际上不起作用。

  • 这是最好的路线吗?
  • 我可以做什么来改进和修复这个方法
  • 我还可以应用其他技巧吗?

这是我的来源:

<div>
    <div>Subpages</div>

    <ul>
    <?php subPages($this->subpages->toArray(), 0) ?>
    </ul>
    <br>
    <a href="javascript:;" onclick="">Add New Subpage</a>
</div>

<?php
    function subPages($subpages, $parent){

        foreach($subpages as $key => &$page){

            $newParent =  $page['id'];

            //If the current page is the parrent start a new list
            if($page['id'] == $parent)
            {
                //Echo out a new list
                echo '<ul>';
                echo '<li class="collapsed">';
                echo '<a href="javascript:;" class="toggle">+</a>';
                echo '<a href="javascript:;" onclick="">'.$page['title'].'</a>';        

                subPages($subpages, $newParent);

                echo '</li>';
                echo '</ul>';
            }
            //If the page's parent id matches the parent provided
            else if($page['parent_id'] == $parent)
            {
                //Echo out the link
                echo '<li class="collapsed">';
                echo '<a href="javascript:;" class="toggle">+</a>';
                echo '<a href="javascript:;" onclick="">'.$page['title'].'</a>';

                //Set the page as the new parent
                $newParent = $page['id'];

                //Remove page from array
                unset($subpages[$key]);

                //Check the rest of the array for children
                subPages($subpages, $newParent);

                echo '</li>';
            }
        }
    }
?>

一如既往,我们感谢任何帮助。如果有不清楚的地方,请告诉我。


我怀疑你们仍在寻找这个问题的真正答案,但这可能会帮助其他遇到同样问题的人。下面是一个递归函数,用于将孩子放在父母之下的数组。

$initial = array(
    array(
        'name' => 'People',
        'ID' => 2,
        'parent' => 0
        ),
    array(
        'name' => 'Paul',
        'ID' => 4,
        'parent' => 2
        ),
    array(
        'name' => 'Liz',
        'ID' => 5,
        'parent' => 2
        ),
    array(
        'name' => 'Comus',
        'ID' => 6,
        'parent' => 3
        ),
    array(
        'name' => 'Mai',
        'ID' => 7,
        'parent' => 2
        ),
    array(
        'name' => 'Titus',
        'ID' => 8,
        'parent' => 3
        ),
    array(
        'name' => 'Adult',
        'ID' => 9,
        'parent' => 6
        ),
    array(
        'name' => 'Puppy',
        'ID' => 10,
        'parent' => 8
        ),
    array(
        'name' => 'Programmers',
        'ID' => 11,
        'parent' => 4
        )   ,
    array(
        'name' => 'Animals',
        'ID' => 3,
        'parent' => 0
        )                           
    );


/*---------------------------------
function parentChildSort_r
$idField        = The item's ID identifier (required)
$parentField    = The item's parent identifier (required)
$els            = The array (required)
$parentID       = The parent ID for which to sort (internal)
$result     = The result set (internal)
$depth          = The depth (internal)
----------------------------------*/

function parentChildSort_r($idField, $parentField, $els, $parentID = 0, &$result = array(), &$depth = 0){
    foreach ($els as $key => $value):
        if ($value[$parentField] == $parentID){
            $value['depth'] = $depth;
            array_push($result, $value);
            unset($els[$key]);
            $oldParent = $parentID; 
            $parentID = $value[$idField];
            $depth++;
            parentChildSort_r($idField,$parentField, $els, $parentID, $result, $depth);
            $parentID = $oldParent;
            $depth--;
        }
    endforeach;
    return $result;
}

$result = parentChildSort_r('ID','parent',$initial);

print '<pre>';
print_r($result);
print '</pre>';

这是一种逐步结束的方法,它从原始数组中删除元素并将它们按正确的顺序放入结果集中。我让它对你来说有点通用,所以它只需要你告诉它你的“ID”字段和“父”字段的名称。顶级项目的parent_id(无论您如何命名)必须为0。我还为每个项目添加了一个深度标记,以便您可以在输出时格式化。

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

PHP 中使用数组上的 foreach 循环对父节点和子节点进行排序的递归函数 的相关文章

  • Yii2 异常:ApcCache 需要加载 PHP apc 扩展

    在高级模板前端的主配置中配置缓存组件时 我收到异常 在我的 php ini 上启用了扩展 rsults 如何解决此问题 前端 config main php cache gt class gt yii caching ApcCache ke
  • 创建动态多维对象/数组

    我正在尝试使用 JS 创建一个多维数组 以便我可以通过 Ajax 调用 PHP 来发布一些数据 这可能很简单 但我对 JS 的了解很少关于这个具体的事情 这是带有代码的 JSFiddle http jsfiddle net k5Q3p 我想
  • zip 文件的校验和

    我目前正在开发一个工具 它上传一组文件 然后使用 md5 校验和将文件与上一批上传的文件进行比较 并告诉您哪些文件已更改 对于常规文件 这工作正常 但某些上传的文件是 zip 存档 即使其中的文件相同 它们几乎总是会发生变化 有没有一种方法
  • 如何通过php的require()或include()函数传递变量?

    当我使用这个时 require diggstyle code php page page no 警告是 无法打开流 第 198 行 C xampp htdocs 4ajax gallery core php 中没有错误 错误是 Failed
  • 在 Symfony 序列化中更改序列化属性名称

    我正在使用 Symfony 序列化器 效果很好 use Symfony Component Serializer Annotation Groups Groups default notification public function g
  • 限制自己超载外部 API 的速率

    我发现了很多信息和脚本示例 展示了如何对 API 用户进行速率限制 但我无法找到任何示例来说明在施加这些限制时如何对您自己的 API 请求进行速率限制 我总是用诸如以下的代码来限制我的脚本sleep or usleep命令 但感觉这是一种低
  • 在哪里可以找到 Java 数组的源代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在哪里可以找到java数组的源代码 Example double arr new double 20
  • Magento - 检查 cms 页面

    我想通过 php 检查页面是否是 Magento 中的 cms page 我需要不同的 cms 页面面包屑 所以我尝试在一个条件下做到这一点 但我不知道如何或在哪里查看 到目前为止 这是我的 breadcrumbs phtml p some
  • fgetcsv 在特定行打开?

    有没有办法使用 fgetcsv 在特定行上打开 我有一个非常大的 csv 想通过 ajax 一次运行大约 100 行 我可以轻松停止 while 循环 但如何在特定行上打开 或者这是不可能的 从第 100 行开始读取没有简单的方法 但您可以
  • 使用 PHP 的 MySQL 连接字符串

    我正在尝试通过本地计算机连接到托管在我的服务器上的数据库 我的服务器有cPanel 11 它是一个典型的共享服务器 由CentOS提供支持 安装了PHP和MySQL 准确地说 我在同一台服务器上持有经销商帐户 我想在不同帐户或域之间访问数据
  • 自动建议 php 的 ajax

    我有一个 html 表单 php 脚本和 jquery 我需要一个 ajax 代码来从我的 php 脚本中进行自动建议 以下是代码 表单 html
  • MySQL PHP邮政编码比较具体距离

    我试图找出比较一个邮政编码 用户提供的 和一大堆其他邮政编码 现在大约有 200 个邮政编码 之间的距离的最有效方法 相对于加载时间 但它会随着时间的推移而增加 我不需要任何精确的东西 只是在球场上 我下载了整个美国的邮政编码 csv 文件
  • 按第一列排序二维数组,然后按第二列排序

    int arrs 1 100 11 22 1 11 2 12 Arrays sort arrs a b gt a 0 b 0 上面的数组已排序为 1 100 1 11 2 12 11 22 我希望它们按以下方式排序a 0 b 0 首先 如果
  • 如何仅使用 PHP5 RecursiveDirectoryIterator 类递归显示具有特定文件类型的文件夹和子文件夹

    您好 我正在尝试使用 FilterIterator 上的扩展来获取 RecursiveDirectoryIterator 类 但由于某种原因 它仅在根目录上进行迭代 我的代码是这样的 class fileTypeFilter extends
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • PHP 数组通过 JSON 转为 jquery 数组

    我有点困惑为什么以下不起作用 get php
  • Fortran 子例程返回错误值

    嘿 我正在开发一个 Fortran 程序 遇到了一个奇怪的问题 当我尝试在调用特定子例程之前直接输出数组的某些值时 我得到了正确的值 然后 我尝试在启动子例程时输出同一数组的一些值 它们都是 0 我最终在子例程之后输出数组的值 并且这些值回
  • 如何从父类中获取子类名

    我试图在不需要子类上的函数的情况下完成此任务 这可能吗 我有一种感觉 但我真的很想确定
  • 如何在laravel中注册后自动登录

    我在 laravel 中注册用户时遇到问题 user假设是包含所有数组元素的数组 同时自动登录以下代码结果false 数据库中保存的密码是hash make password user id this gt user model gt ad
  • 一种无需 JavaScript 即可在 PHP 中确定浏览器宽度的方法?

    首先有吗 或者我必须使用javascript 我希望能够更改使用的 CSS 因此 frex 我可以为移动设备或其他设备加载较小的字体 不幸的是 仅使用 PHP 无法检测用户分辨率 如果您使用 Javascript 则可以在 cookie 中

随机推荐

  • Java 非最终 int(s) 构造后可见

    我有一个带有非最终 int 变量的 java 类 我在构造函数中将其显式初始化为 0 对该变量的所有其他访问均由 ReentrantLock 管理 我是否需要担心线程不会看到初始值 0 因为我没有在构造函数中使用锁 是的 你必须担心 为了避
  • 如何通过命令提示符获取硬件 ID/序列号?

    最终我将在 Java Applet 中使用它来为用户提供额外的安全性 我知道这是可能的 因为我记得以前做过 只是不记得获取正确信息的行 我正在寻找将返回处理器 ID 序列号的行 只要这两个就好了 我使用过谷歌并尝试了一些命令 例如 wmic
  • SQL Server 2005 中使用 XML 的层次结构

    我想知道是否有办法在 SQL Server 2005 中选择层次结构并返回 xml 格式 我有一个包含大量数据的数据库 大约 2000 到 3000 条记录 我现在使用 SQL Server 2005 中的一个函数来检索层次结构中的数据并返
  • C#中如何获取IP地址?

    假设一台计算机连接到许多网络 实际上不止一个 我可以获得一个IP地址列表 其中包括计算机在网络中拥有的所有IP地址 但是我如何知道某个IP地址属于哪个网络呢 首先 您需要了解一些术语 这些示例数字假定 IPv4 网络 IP地址 192 16
  • 如何为 Json.net 生成 json 对象的所有可能的 LINQ 字符串?

    在 json net 中 我们可以使用基于 linq to json 的本教程 我想知道有没有办法生成字符串查询 考虑这个 json 示例 Name Test Status S1 S2 S3 S4 People Name A Family
  • 使用facet_wrap向ggplot添加图例

    我在用小面包裹显示两个变量 a and b 四个城市 我可以根据城市对图进行分组 但无法显示变量的图例 即a and b using scale color discrete ggplot geom line data df aes x y
  • Angular 7 - 重新加载数据表中的数据

    我正在使用 Angular 7 和 Angular Datatables 我正在尝试定义一个 重新渲染 按钮以重新加载数据就像这个例子一样 我不明白应该在渲染函数中放置什么 我的API函数 fn getFavoriteTables this
  • SQL Server 查询日期范围内一个月的总天数

    我有特定的日期范围 例如 From Date To Date 2012 11 10 2012 11 15 2012 11 21 2012 11 22 2012 11 30 2012 12 01 我想编写一个 SQL 查询来计算两个日期之间的
  • KML / Google 地图 - 指定 iFrame 中嵌入地图的缩放级别

    我在 Google 地图中加载了以下 kml 文件 它正确定位了指针 但它始终以最大级别缩放 使用谷歌地图 API 我可以设置自己的缩放级别 但我尝试使用 iFrame 中的嵌入式地图 由谷歌提供 来执行此操作 有没有办法在 kml 本身中
  • 使用 objectify 进行过滤和排序的 GAE 数据存储查询

    我正在尝试在数据存储中查询过去一周 日期字段 登录的得分最高的 100 位用户 List
  • URL 是否允许包含空格?

    URI 特别是 HTTP URL 是否允许包含一个或多个空格字符 如果一个网址must被编码 是 只是一个普遍遵循的惯例 还是一个合法的替代方案 特别是 有人可以指出一个 RFC 来指示带有空格的 URLmust被编码 提问动机 在对网站进
  • 如何扩展 VpnService 以在 Android 中以编程方式打开 L2TP/IPSEC 连接?

    我正在寻求实施一个解决方案来打开一个L2TP IPSEC来自android应用程序的连接 所以我可以简单地传递server ip pre shared key username and password因此设备已连接到此 VPN 服务器 我
  • 如何在内核中打印当前时间?

    我是linux的初学者 抱歉我的英语不好 我应该打印当前时间并通过Linux中的系统调用做一些事情 我做了其他事情但未能打印当前时间 我写的是 include
  • Codeigniter 的路由不正确

    我安装了 Windows 版 Apache 我购买了 CodeIgniter Professional 并下载了他们的源代码 它说我应该将其 htaccess 放在网站的根文件夹中 所以我这样做了 我将基本 URL 设置为http 127
  • 获取公共互联网 IP 地址/地理位置的智能方法

    我在本地网络上有一台计算机 位于 NAT 路由器后面 我有一些 192 168 0 x 地址 但我真的很想知道我的publicIP 地址 未在 如何获取运行 C 应用程序的服务器的 IP 地址 or 如何在C 中获取机器的IP地址 我需要
  • 是否有一个类似字典的不可变对象? [复制]

    这个问题在这里已经有答案了 我想要一个Python对象 它可以灵活地接受任何键 并且我可以通过键访问 就像字典一样 但它是不可变的 一种选择是灵活地生成namedtuple但这样做是不好的做法吗 在下面的示例中 linter 不会期望nt有
  • 在 Chrome 扩展中显示几个 JS 变量值

    是否可以在我构建的扩展中获取我的网站 2 3 js 变量 以便我能够看到我构建的网站背后的信息 该扩展将帮助我开发我的网站 查看给定网站的变量 使用内容脚本 是可能的 只需注入您自己的内容脚本 并创建一个读取变量的脚本标记 由于内容脚本功能
  • 在Windows 7中为java和ant设置环境变量

    我有一本书说要执行以下操作 添加 JAVA HOME 和 ANT HOME 环境变量 查看 将 JAVA HOME bin 和 ANT HOME bin 添加到我的路径变量 检查 当我转到命令提示符并尝试 ant version 时 它说
  • 如何创建像 std::cout 这样的函数?

    我正在为我的项目创建自己的日志记录实用程序 我想创建一个像 iostream 的 std cout 这样的函数 以记录到文件并打印到控制台 这就是我想要的 enum debug error warning info LOG level lt
  • PHP 中使用数组上的 foreach 循环对父节点和子节点进行排序的递归函数

    我有一个存储在数组中的数据集 该数组使用父子 id 引用自身 id parent id title等等 顶层有一个parent id of 0 可以有无数的亲子关系 所以我用一个对这个数组进行排序foreach在递归函数中循环以根据其父元素