1

我实际上正在研究ZF。我有一个类别表,我想创建一个树以便显示如下数据:

Category
--Sub cat 1
--Sub cat 2
----Su sub cat 1
Another Category
--Sub cat 1
//...etc...

我正在使用该fetchAll方法获取所有数据。一切正常。但是我现在正试图将我的树创建为一个双 foreach 循环,如下所示:

$tree = array();
foreach($data as $parent){
    $tree[$parent->name] = array();
    foreach($data as $child){
        if($child->parent_id == $parent->id){
            $tree[$parent->name][] = $child->name;
        }
    }
}

问题是循环在main循环第一次迭代后停止,所以我只是得到第一个父级,它是子类别,但它不会继续到第二个父级。

我的数据库表为以下字段:

id, name, parent_id

任何的想法?

编辑 感谢您 Thibault,它确实使用了良好的旧for循环:

for($i=0;$i<count($data);$i++){
    $tree[$data[$i]->name] = array();
    for($j=0;$j<count($data);$j++){
        if($data[$j]->parent_id == $data[$i]->id){
            $tree[$data[$i]->name][] = $data[$j]->name;
        }
    }
}
4

1 回答 1

0

您可能在两个$data变量的游标之间存在冲突。

$data您应该使用第二个foreach循环的副本。

或者使用for带有$i$j索引的循环,并通过和调用它们$data[$i]$data[$j]访问数组,这样循环就不会被弄乱。

编辑 很高兴我可以提供帮助,但经过一些研究,我创建了这段代码:

<?

class o {
 public $id;
 public $name;
 public $parent_id;
 function __construct($_id,$_name,$_parent) {
  $this->id = $_id;
  $this->name = $_name;
  $this->parent_id = $_parent;
 }
}
$data = array(
 new o(1,'toto',0),
 new o(2,'truc',1),
 new o(3,'machin',1),
 new o(4,'bidule',2),
 new o(5,'titi',3),
 new o(6,'tutu',3),
);


$tree = array();
foreach($data as $parent){
    $tree[$parent->name] = array();
    foreach($data as $child){
        if($child->parent_id == $parent->id){
            $tree[$parent->name][] = $child->name;
        }
    }
}

print_r($tree);

而且你的代码工作得很好:(其他地方一定有问题......)

Array
(
    [toto] => Array
        (
            [0] => truc
            [1] => machin
        )

    [truc] => Array
        (
            [0] => bidule
        )

    [machin] => Array
        (
            [0] => titi
            [1] => tutu
        )

    [bidule] => Array
        (
        )

    [titi] => Array
        (
        )

    [tutu] => Array
        (
        )

)
于 2013-04-04T08:07:52.160 回答