根据父 ID 值将数组从一维转换为多维

2024-03-12

我有一个代表多维数据的一维对象数组:

array(
    array(
        "id" => 45,
        "parent_id" => null
    ),
    array(
        "id" => 200,
        "parent_id" => 45
    ),
    array(
        "id" => 345,
        "parent_id" => 45
    ),
    array(
        "id" => "355",
        "parent_id" => 200
    )
);

我应该如何将其转换为多维数组:

array(
    array(
        "id" => 45,
        "parent_id" => null,
        "children" => array(
            array(
                "id" => 200,
                "parent_id" => 45,
                "children" => array(
                    "id" => "355",
                    "parent_id" => 200
                )

            ),
            array(
                "id" => 345,
                "parent_id" => 45
            ),
        )
    ),
);

以下代码示例converts数组$array进入您正在寻找的树结构:

// key the array by id
$keyed = array();
foreach($array as &$value)
{
    $keyed[$value['id']] = &$value;
}
unset($value);
$array = $keyed;
unset($keyed);

// tree it
$tree = array();
foreach($array as &$value)
{
    if ($parent = $value['parent_id'])
        $array[$parent]['children'][] = &$value;
    else
        $tree[] = &$value;
}
unset($value);
$array = $tree;
unset($tree);

var_dump($array); # your result

这不起作用,如果有existing父 ID 即0。但可以很容易地改变以反映这一点。

这是一个相关的问题,原始数组已经被键入,因此解决方案的前半部分可以省去:嵌套数组。第三层正在消失 https://stackoverflow.com/questions/7673044/nested-array-third-level-is-disappearing/7673415.

Edit:

那么这是如何运作的呢?这是利用 PHP 变量别名(也称为参考 http://www.php.net/manual/en/language.references.php)和(临时)数组,用于存储 a) 节点的别名($keyed) 和 b) 构建新的树序 ($tree).

您能[...]解释一下这样做的目的吗?$array = $keyed, $array = $tree和未设置的?

既,$keyed and $tree包含对值的引用$array,我首先将该信息复制到$array, e.g.:

$array = $keyed;

As now $keyed仍然设置(并且包含对与中相同的值的引用$array), $keyed未设置:

unset($keyed);

这会取消设置中的所有引用$keyed并确保,所有值$array不再被引用(该值的引用计数减少一)。

如果迭代后未取消设置临时数组,则它们的引用仍然存在。如果你使用var_dump on $array,你会看到所有的值都有一个&放在前面,因为它们仍然被引用。unset($keyed)删除这些引用,var_dump($array)再次,你会看到&已经走了。

我希望这是可以理解的,如果您不熟悉参考文献,有时会很难理解它们。它经常帮助我将它们视为变量别名。

如果您想要锻炼身体,请考虑以下事项:

如何转换你的$array通过一次 foreach 迭代从平面到树?

当您想要单击包含以下内容的链接时,请自行决定Solution http://codepad.viper-7.com/IUUDC4.

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

根据父 ID 值将数组从一维转换为多维 的相关文章

  • 如何使用 HHVM proxygen 重写规则忽略任何文件?

    我创建一个这样的文件example ini hhvm server type proxygen hhvm server default document index php hhvm virtual host default rewrite
  • Apache 重写 - 获取 PHP 中的原始 URL

    我在 nginx 或 Apache 中重写了这个地址 http domain com hello 到像这样的脚本 http domain com test php ref hell 如何在 PHP 中访问这个重写的 URL 因为 如果我使用
  • 如何通过 API 平台使用“paramconverter”?

    如何通过 Symfony API 平台实现或使用 paramconverter 我想在路线上使用实体 ID 并立即生成一个对象 准备在控制器中使用 我没有在这个项目上使用注释 路由配置位于 YAML 文件中 resources App Me
  • 如何在 Twig 中渲染树

    我想渲染一棵深度不确定的树 孩子的孩子的孩子等 我需要递归地循环遍历数组 我怎样才能在 Twig 中做到这一点 我玩过domi27的想法 https stackoverflow com questions 8326482 how to re
  • PHP:file_get_contents 与 json_decode 不能一起工作

    使用 file get contents 读取 json 文件后遇到问题 当我运行这段代码时 它工作正常
  • 如何在 Laravel 中编写联合查询?

    我正在使用 laravel 5 0 并且我有 mysql 查询 SELECT surat masuk id surat surat masuk nomor surat FROM surat masuk WHERE EXISTS SELECT
  • 执行数组内的函数

    是否可以从数组内部执行匿名函数 也在数组内部定义 return execute function logic 或者我应该在外面定义它然后再调用它 从技术上讲 您可以将该函数括在括号中并像这样调用它 return function retur
  • PHP - 发送带有附件的电子邮件不显示消息内容

    尝试创建一个脚本 我可以在其中发送带有附件的电子邮件 一切正常 除了当我不在电子邮件中添加文件时 我仍然可以看到带有 0B 且没有名称的附件 if isset POST my send email to POST my email to r
  • Laravel 5 / Codeception 未正确路由

    我正在尝试使用代码接收为控制器函数编写 API 测试用例 但遇到了一个问题 即控制器函数的路由似乎未正确评估 并且评估似乎根据我的不同而不同我的测试用例中有 这是我的测试用例中的代码示例 use ApiTester class Custom
  • PHP 5 的 SQLite 编译设置是什么?

    SQLite 3 7 附带了新的预写日志记录 WAL http www sqlite org wal html并且有很多设置可以被配置 http www sqlite org compile html 但是 似乎没有任何方法可以改变任何事情
  • PHP 和 ADODB 连接失败

    我的任务是迁移服务器 这包括移动我没有构建的应用程序 其中一些具有 ADODB connection 我似乎无法在新服务器上修复它 我只得到空白屏幕 我已经对 ADODB connection 与 PHP 进行了相当广泛的研究 但找不到明确
  • PDO fetch() 失败时会抛出异常吗?

    有没有方法PDO语句 fetch http php net manual en pdostatement fetch php如果 PDO 错误报告系统设置为抛出异常 则在失败时抛出异常 例如 如果我设置 PDO ATTR ERRMODE g
  • php包含来自另一个目录的文件

    这是一个结构示例 main css style css include article1 php article2 php header php index php 在我的 header php 中 我有以下 css 代码 例如 在我的 i
  • Zend Framework 2 将变量传递给模型

    我目前正在开发一个多语言网站 对于多语言部分 我使用翻译器 poedit 我将所选语言存储在会话中 效果很好 模块 php public function onBootstrap MvcEvent e session new Contain
  • 何时以及为何应使用 $_REQUEST 而不是 $_GET / $_POST / $_COOKIE?

    标题中的问题 当所有 3 个都发生时会发生什么 GET foo POST foo and COOKIE foo exist 其中哪一个被包含到 REQUEST 我想说永远不会 如果我想通过各种方法设置某些内容 我会为每个方法编写代码以提醒自
  • 从 CodeIgniter 中的 URL 捕获哈希值 (#)

    我有一个看起来像的网址 mysite com transactions view 123456 效果很好 但是我的客户现在希望在 url 中包含 hashbang mysite com transactions view 123456 现在
  • PHP邮件功能有时可以工作

    我正在编写一个脚本 需要通过PHP邮件功能发送电子邮件 如下所示 它在向 gmail 帐户发送电子邮件时有效 但在我的域中的帐户却无效 我们正在运行 Exchange 服务器 截至目前 电子邮件是从 www server 发送的 有谁知道
  • 重新安装后使用 pandas dataframes 时出现问题

    我已经重新安装了 Python 和 Anaconda 现在面临以下问题 在我将 pkl 文件加载到数据帧并尝试 查看 该文件后 如下所示 df pd read pickle example pkl df 我收到错误 AttributeErr
  • 学说“没有命名的协会”

    将我添加到无法找出其学说映射出了什么问题的人列表中 我正在模拟国际象棋Game与一对多Halfmoves 有任何想法吗 DDL create table game game id int primary key create table h
  • php 打印 aa aaa ab aab 直到 zzz 的算法

    你好 我需要打印从 a 到 zzz 最多 3 个字母 例如我的输出应该是 A B Z AA AB AZ BA BB ZZ AAA AAB ZZZ 我在过去的 5 个小时里努力尝试 我找不到任何逻辑 我尝试了下面的代码 PHP 有一个方便的功

随机推荐