加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 17:09:14 所属栏目:PHP教程 来源:网络整理
导读:我有一个表示多维数据的一维对象数组: array( array( "id" = 45,"parent_id" = null ),array( "id" = 200,"parent_id" = 45 ),array( "id" = 345,array( "id" = "355","parent_id" = 200 )); 我应该如何将其转换为多维数组: array( array( "id" = 45,"pare
我有一个表示多维数据的一维对象数组:

array(
    array(
        "id" => 45,"parent_id" => null
    ),array(
        "id" => 200,"parent_id" => 45
    ),array(
        "id" => 345,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
            ),)
    ),);

解决方法

下面的代码示例将数组$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

如果现有的父ID为0,则不起作用.但可以轻松更改以反映这一点.

这是一个相关的问题,原始阵列已经锁定,所以解决方案的前半部分可以省去:Nested array. Third level is disappearing.

编辑:

那么这是如何工作的呢?这是利用PHP变量别名(也称为references)和(临时)数组,用于存储a)别名到节点($keyed)和b)来构建新的树顺序($tree).

Could you […] explain the purpose of $array = $keyed,$array = $tree and the unsets?

由于$keyed和$tree都包含对$array中值的引用,我首先将该信息复制到$array中,例如:

$array = $keyed;

由于现在$keyed仍然设置(并且包含与$array中相同值的引用),因此取消设置$keyed:

unset($keyed);

这将取消设置$keyed中的所有引用,并确保$array中的所有值都不再被引用(值的refcount减1).

如果迭代后没有取消设置临时数组,它们的引用仍然存在.如果你在$array上使用var_dump,你会发现所有的值都有一个&在前面,因为他们仍然被引用. unset($keyed)再次删除这些引用,var_dump($array),你会发现& s已经消失了.

我希望这是可以理解的,如果你不能流利的话,有时很难引用参考文献.它经常帮助我将它们视为可变别名.

如果您想进行一些锻炼,请考虑以下事项:

How to convert your $array from flat to tree with one foreach iteration?

当您想要单击包含Solution的链接时,请自行决定.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读