递归树遍历 - 如何跟踪递归级别?

2024-05-24

我基本上试图从表示树结构的多维数组构建 html ul/li 嵌套列表。

下面的代码工作正常,但我想改进它:

我需要一种方法来跟踪递归级别,以便我可以将不同的类应用于不同的级别,向生成的输出添加缩进等。

function buildTree($tree_array, $display_field, $children_field, $class='', $id='') {

  echo "<ul>\n";

  foreach ($tree_array as $row) {

    echo "<li>\n";
    echo $row[$display_field] . "\n";

    if (isset($row[$children_field])) {

      $this->buildTree($row[$children_field]);
    }
    echo "</li>\n";
  }
  echo "</ul>\n";
} 

$tree_array 看起来像这样:

Array
(
    [0] => Array
        (
            [category_id] => 1
            [category_name] => calculatoare
            [parent_id] => 0
            [children] => Array
                (
                    [0] => Array
                        (
                            [category_id] => 4
                            [category_name] => placi de baza
                            [parent_id] => 1
                        )

                    [1] => Array
                        (
                            [category_id] => 5
                            [category_name] => carcase
                            [parent_id] => 1
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [category_id] => 6
                                            [category_name] => midi-tower
                                            [parent_id] => 5
                                        )

                                )

                        )

                )

        )

    [1] => Array
        (
            [category_id] => 2
            [category_name] => electronice
            [parent_id] => 0
        )

    [2] => Array
        (
            [category_id] => 3
            [category_name] => carti
            [parent_id] => 0
        )

)

我将其标记为作业,因为我想以此为契机来提高我对递归的(较差)理解,因此,我希望得到能够指导我找到解决方案的答案,而不是提供完整的工作示例: )


快速而肮脏的方法(请参阅下面的“剧透”块以了解实现):

添加附加变量$recursionDepth到你的函数声明中,使其0默认情况下。

在每个后续递归中,使用以下命令调用您的函数$recursionDepth + 1.

由于函数变量仅对于函数的相应实例“可见”(作用域),因此您最终将得到当前迭代深度的指示器。

另外,你的函数的第 12 行

$this->buildTree();

在我看来,它似乎不起作用——原因是你没有将变量传递给下一个实例buildTree.

它可能应该看起来像这样:

$this->buildTree($row[$children_field], $display_field, $children_field, $class, $id)

以下是我对您的代码进行的更改以实现您想要的效果:

function buildTree($tree_array, $display_field, $children_field, $class='', $id='', $recursionDepth = 0, $maxDepth = false)
{
    if ($maxDepth && ($recursionDepth == $maxDepth)) return;

    echo "<ul>\n";

    foreach ($tree_array as $row)
    {
        echo "<li>\n";
        echo $row[$display_field] . "\n";

        if (isset($row[$children_field]))
            $this->buildTree($row[$children_field], $display_field, $children_field, $class, $id, $recursionDepth + 1, $maxDepth);

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

递归树遍历 - 如何跟踪递归级别? 的相关文章

  • 重定向而不改变url

    我总是不喜欢 htaccess 我正在尝试建立一个所有请求都通过index php 的网站 但我希望URL 类似于www sample com home 该网址实际上会加载 www sample com index php page hom
  • 优雅地处理没有数据的 amcharts

    我想知道我的 dataProvider 是否为空 amCharts绘制时默认为null 我怎样才能动态地处理它 var chart AmCharts makeChart chartdiv theme none type serial dat
  • 如何解压 PHP/Lumen/Laravel 的 gzip 请求?

    我收到来自第三方的 gzip 编码文本请求 1mb 所以这是有道理的 我的测试路线 router gt post testgzip function Illuminate Http Request request decompressed
  • 如何检查PHP变量是否包含非数字?

    我只是想知道检查 PHP 变量中是否有非数字的方法以及它是否也检测字符之间的空格 需要确保我的表单字段中没有添加任何奇怪的内容 提前致谢 如果您的意思是您只想要一个包含数字的值 那么您可以使用ctype digit http php net
  • FPDI/FPDF:水印和打印多页

    我修改了这个堆栈问题 当用户尝试下载文件时在 pdf 文件上应用水印 https stackoverflow com questions 3983432 applying watermarks on pdf files when users
  • 检查 PHP 中“@”字符后面的单词

    我现在正在制作一个新闻和评论系统 但是我已经在一个部分上停留了一段时间了 我希望用户能够在 Twitter 上引用其他玩家的风格 例如 用户名 该脚本看起来像这样 不是真正的 PHP 只是想象脚本 3 string I loved the
  • 从 smarty 访问 PHP 文件的变量(本地或全局)

    我有一个 php 文件 其中包含一些本地和全局变量 例如 foo 从此文件中调用 smarty 对象 如何在不更改 PHP 文件的情况下从 smarty 脚本访问 foo Thanks 如果你有一个名为 BASE 的常量变量 并且定义如下
  • 为什么我需要结束 ob_start()?

    php 文档建议我应该用 ob end flush 结束每个 ob start 我在网站的每个页面上使用一个 只是为了允许我在应用程序中的任何位置使用 firephp 日志方法 该应用程序运行良好 但我想知道是否有任何我不知道的东西可能有害
  • 如何在原则 2 迁移中删除外键

    我想在原则 2 迁移中删除外键 但没有 dropForeignKeyConstraint 有谁知道怎么丢掉吗 public function down Schema schema table schema gt getTable table
  • PHP 在输入流中使用 fwrite 和 fread

    我正在寻找将 PHP 输入流的内容写入磁盘的最有效方法 而不使用授予 PHP 脚本的大量内存 例如 如果可以上传的最大文件大小为 1 GB 但 PHP 只有 32 MB 内存 define MAX FILE LEN 1073741824 1
  • 在 PHP 中使用 phpseclib 时出现 RSA 问题

    我正在尝试在 phpseclib 中使用 RSA 实现 我认为在函数中执行一次代码并重新使用该函数会更容易 当我尝试向代码发送短信时 我收到一条错误消息 提示 解密错误 测试还让我意识到每次代码运行时密文都是不同的 所以我显然在那里做错了什
  • 在 Wordpress 站点中进行 AJAX 调用时出现问题

    我在使用 Wordpress 站点功能的 AJAX 部分时遇到了一些问题 该功能接受在表单上输入的邮政编码 使用 PHP 函数来查找邮政编码是否引用特定位置并返回到该位置的永久链接 我的第一个问题是关于我构建的表单 现在我的表单操作是空白的
  • PHP preg_filter 返回意外的长值

    尝试在 Woocommerce 中删除标签并过滤值 但无法以正确的格式获取它 有东西有腥味 我正在使用WC gt cart gt get cart subtotal 来检索该值 在此示例中 我的值是 2 429kr 原始返回值是 span
  • 通过 $_SESSION 从一个脚本发送到另一个脚本期间数据丢失

    我正在尝试将一个充满属性的对象从一个 PHP 发送到另一个 PHP SESSION object obj where obj是一个用 foreach 循环指定的对象 foreach array of objects as obj SESSI
  • 在 apache docker 容器中运行虚拟主机

    我在同一个 apache 容器中有两个 php 应用程序 我试图在端口上运行其中一个应用程序 因为它需要通过根域而不是子文件夹进行访问 我想在端口 8060 上运行应用程序 我尝试使用 apache 虚拟主机执行此操作 但它不会加载页面 h
  • 使用 Ajax.Request 将 JSON 从浏览器传递到 PHP 的最佳方法

    您好 我有一个 JSON 对象 它是一个二维数组 我需要使用 Ajax Request 将其传递给 PHP 我知道的唯一方法 现在我使用js函数手动序列化我的数组 并获取以下格式的数据 s 1 d 3 4等 我的问题是 有没有办法更直接 有
  • 表单计算器脚本基本价格未加载 OnLoad

    我的表单中有一个计算器来计算我的下拉选项选择 function select calculate on change calc input type checkbox calculate on click calc function cal
  • CURL 中的 data-urlencode 是什么意思?

    我搜索了很多个小时试图弄清楚 php curl 中的 data urlencode 是什么 我尝试过这个 但我认为这是不对的 xmlpost object1 file https www lob com goblue pdf 在文档中是 d
  • 一次播种多行 laravel 5

    我目前正在尝试为我的用户表播种 如果我像这样尝试 2 行 就会失败 如果我只使用单个数组而不是 users 数组内的 2 个数组来创建一些假数据 那么效果很好 我做错了什么 正确的方法是什么 class UserTableSeeder ex
  • php,统计字符并删除超过140个字符的内容

    我需要一个 PHP 函数来计算短语的字符数 如果短语长度超过 140 个字符 则此函数应删除所有其他字符并在短语末尾添加三个点 例如我们有 message I am what I am and you are what you are et

随机推荐

  • 我如何(或者应该?)从 Grails 中的 SiteMesh 模板 (views/layouts/main.gsp) 访问服务层?

    我需要在我正在构建的网站的页脚中创建一个顶部列表 页脚是在默认的 SiteMesh 布局模板中创建的 views layouts main gsp 为了创建顶部列表 需要访问数据库 因此我将创建顶部列表所需的所有逻辑封装在服务类中 serv
  • 使用 AAACertificateServices 证书的域示例

    如何找到根证书为的域AAA证书服务 https support sectigo com Com KnowledgeDetailPage Id kA03l00000117cL 请注意 这是 Comodo 证书 为了准备一个其证书即将更改的依赖
  • ExpressJS 后端将请求放入队列

    我有客户端发送要由服务器执行的任务 但这些请求应该以类似队列的方式处理 知道我该怎么做吗 谢谢 express Router post tasks function req res This is the task to perform W
  • Android 上谷歌地图的缩放事件

    我们正在构建一个使用 Android 版谷歌地图 API 的应用程序 我有我的 MapController 和 MapView 并且我使用以下方法启用内置缩放控件 mapView setBuiltInZoomControls true 我现
  • Yii urlManager URL 中的语言

    我正在尝试使用以下语法向 url 添加语言 http www example com en site page view about http www example com en site page view about 到目前为止 我所
  • 如何将 application.properties 转换为地图的 application.yml

    我试过了 还是不行 请问我哪里出错了 application properties 工作正常 document contact name joe email email protected cdn cgi l email protectio
  • 更改 pyttsx3 语言

    当尝试使用 pyttsx3 时 我只能使用英语语音 我也希望能够使用荷兰语 我已经在 Windows 设置菜单中安装了文本转语音语言包 但我仍然只能使用默认的英文语音 我怎样才能解决这个问题 如果您想更改语言 您需要更改为支持您的语言的另一
  • 使用 writeLines 将变量写入文件

    我发现此链接对于理解如何将行写入文件非常有帮助 将文本行写入 R 中的文件 https stackoverflow com questions 2470248 write lines of text to a file in r 不幸的是
  • Microsoft 身份 - 撤销授权

    我正在开发一个 NET 应用程序 它可以使用 Graph API 代表用户发送电子邮件 提示用户对应用程序进行授权 然后使用获取的访问令牌来调用 Graph API 刷新令牌用于在旧访问令牌过期时颁发新的访问令牌 如下所述 https le
  • 检查 Unix 消息队列是否为空

    谁能告诉我如何检查消息队列中是否有消息 消息队列是在基于Linux的操作系统中用C语言实现的 我只是想检查在特定时间消息队列中是否有消息 只需使用以下命令即可检查消息数量 如果有 msgctl 函数 并在返回时检查 msqid ds 结构
  • 使用 ssh-keygen 创建 SSH 密钥不会创建 .ssh 文件夹

    我正在尝试使用 msysgit 创建我的公共 私有 rsa 密钥对 我运行这个命令 ssh keygen C email protected cdn cgi l email protection t rsa 一切看起来都很好 我收到消息了
  • 如何使用 PowerShell 发布 Azure 网站 (xxx.azurewebsites.net)?

    我已经在一个文件夹中准备好了我的网站 我知道如何使用 Azure PowerShell 创建站点 在Azure管理门户中 我只需要通过FTP复制站点文件 但我不知道如何使用 PowerShell 将我的网站文件推送到 Azure 有人可以透
  • 设计 ASP.NET 图表控件的样式

    使用 which 是一个子集 http blogs msdn com alexgor archive 2008 11 07 microsoft chart control vs dundas chart control aspx of th
  • SQL Server 登录错误:用户“NT AUTHORITY\SYSTEM”登录失败

    我创建了一个名为 schoolPool 的应用程序池并将其分配给我的 Web 应用程序 该池的标识已设置为 LocalSystem 当我尝试从应用程序内访问数据库 即打开 SQL 连接 时 我总是收到以下错误 Login failed fo
  • 敏捷与迭代和增量开发之间的区别[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 敏捷开发与迭代增量开发有什么区别 敏捷是否被视为迭代和增量 一些信息表明敏捷是最新的迭代和增量 我需要对此做出明确的澄清 迭代 你不可能一次性完
  • 在非 WordPress php 页面之外显示 WordPress 帖子

    我需要在非 WordPress php 页面中显示 WordPress 博客文章 我已经尝试过以下代码
  • 计算连续有多少次和的结果为正(或负)

    第一部分 我有一个包含财务数据的数据框 33023 行 这里是指向 数据 https mab to Ssy3TelRs https mab to Ssy3TelRs df open 是标题的价格 df close 是收盘价 我一直想看看标题
  • 为什么我的 Dockerfile CMD 不起作用?

    所以在我的 Dockerfile 的末尾我有这样的内容 WORKDIR home CMD django admin startproject whattt CMD bin bash 当我创建映像然后运行容器时 一切都按预期运行 没有错误 D
  • 按值或 ID 选择更多复选框

    我有这段代码 我想在其中创建一个切换按钮来选择 2 个或更多复选框 例如 意大利和德国 我正在尝试这段代码 但我无法让它工作 document on click checkbox button function e var checks i
  • 递归树遍历 - 如何跟踪递归级别?

    我基本上试图从表示树结构的多维数组构建 html ul li 嵌套列表 下面的代码工作正常 但我想改进它 我需要一种方法来跟踪递归级别 以便我可以将不同的类应用于不同的级别 向生成的输出添加缩进等 function buildTree tr