【问题标题】:Recursive array from structure with only childids来自只有 childid 的结构的递归数组
【发布时间】:2015-07-16 19:29:38
【问题描述】:

我有这样的结构

$list = array(
  array('code'=>1,'children'=>array(2,3),'name'=>'number one'),
  array('code'=>2,'children'=>array(4),'name'=>'number two'),
  array('code'=>3,'children'=>array(5,6),'name'=>'number three'),
  array('code'=>4,'children'=>array(7),'name'=>'number four'),
  array('code'=>5,'children'=>array(),'name'=>'number five'),
  array('code'=>6,'children'=>array(8),'name'=>'number six'),
  array('code'=>7,'children'=>array(),'name'=>'number seven'),
  array('code'=>8,'children'=>array(),'name'=>'number eight')
);

我需要回报是

array(
  array('code'=>1,'children'=>array(
    array('code'=>2,'children'=>array(
      array('code'=>4,'children'=>array(7),'name'=>'number four'),
    ),'name'=>'number two'),
    array('code'=>3,'children'=>array(
       array('code'=>5,'children'=>array(),'name'=>'number five'),
       array('code'=>6,'children'=>array(
          array('code'=>8,'children'=>array(),'name'=>'number eight')
       ),'name'=>'number six'),
    ),'name'=>'number three'),
  ),'name'=>'number one')
);

请注意,我没有父 ID,只有子 ID。并且 id 不是密钥(尽管我可以制作一个 foreach 并从中制作一个密钥)。有什么想法可以用最少的段落做到这一点吗?

【问题讨论】:

  • 我们这里不是代码编写服务!你试过了吗?
  • 这不是正确的态度...
  • 并被否决了,因此获得帮助的机会几乎已经完成。那好吧。也许我将来会回答我自己的问题
  • @Ricardo 我认为这里的人们可能有点太快了,无法假设缺乏努力。虽然有很多“代码请!”问题,这似乎不是一个。对于那些标记为“算法”的人来说,这尤其是一个问题,因为他们往往是在编写任何代码之前!
  • 不过,尝试一下可能会有所帮助。与提供解决方案的其他人相比,人们通常从实验中学到更多。

标签: php algorithm recursion


【解决方案1】:

这个怎么样:

//2 pass:

//#1 add keys, objectify
$output = array();
foreach ($list as $k => $el) {
    $output[$k + 1] = (object) $el;
}

//#2 build
foreach($output as $k=>$el) {
    if (!empty($el->children)) {
        $children=$el->children;
        $output[$k]->children=array();
        foreach($children as $childID) {
            $output[$k]->children[]=$output[$childID];
        }
    } else {
        //remove it, no child nodes
        unset($output[$k]->children);
    }
}

所以,$output[1] 拥有我们的树,而 $output 的其余部分可以被丢弃,因为它本质上只是对附加到 1 的节点的额外引用。

$tree=$output[1];

print_r($tree);
stdClass Object
(
    [code] => 1
    [children] => Array
        (
            [0] => stdClass Object
                (
                    [code] => 2
                    [children] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [code] => 4
                                    [children] => Array
                                        (
                                            [0] => stdClass Object
                                                (
                                                    [code] => 7
                                                    [name] => number seven
                                                )

                                        )

                                    [name] => number four
                                )

                        )

                    [name] => number two
                )

            [1] => stdClass Object
                (
                    [code] => 3
                    [children] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [code] => 5
                                    [name] => number five
                                )

                            [1] => stdClass Object
                                (
                                    [code] => 6
                                    [children] => Array
                                        (
                                            [0] => stdClass Object
                                                (
                                                    [code] => 8
                                                    [name] => number eight
                                                )

                                        )

                                    [name] => number six
                                )

                        )

                    [name] => number three
                )

        )

    [name] => number one
)

由于我使用了对象,因此我的结构与您的结构略有不同,对象更适合于此,因为它们是通过引用访问的,这是您在处理节点时想要的。如果这是JSON,它很可能会成为一个对象。

【讨论】:

  • 好伙伴!使用 objs 并且只引用它们,我可以影响它们并更新所有引用,而无需再次弄乱。这符合一些调整的法案。真的很好。谢谢你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
相关资源
最近更新 更多