Zend框架foreach循环停止吃第一次迭代

时间:2013-04-04 07:54:10

标签: php zend-framework foreach tree

我实际上在研究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;
        }
    }
}

1 个答案:

答案 0 :(得分: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
        (
        )

)