2013-04-04 106 views
1

我实际上在ZF上工作。我有一个类别表与,我想为了得到如下显示的数据来创建树:Zend框架foreach循环停止吃了第一次迭代

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

我使用fetchAll方法来得到我的所有数据。 Everyting工作正常。但随后我现在试图建立我的树成如下双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 

任何想法?

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; 
     } 
    } 
} 
+0

您确定您获得超过1个类别吗? – Perry 2013-04-04 08:01:48

+0

嗨,谢谢你的回答。是的,我有几个类别的数据库返回。我已经检查过,所以我不明白为什么它会这样打破。此外,如果我删除第二个循环,一切都很好,循环工作 – lkartono 2013-04-04 08:05:09

回答

0

你可能有两个游标变量$data之间的冲突:

编辑 感谢您蒂博,它使用好老for循环做的工作。

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

或者使用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 
     (
     ) 

) 
+0

嗨,我已经做了一个数据副本之前在2个不同的变量称为'$父母'和'$子女',但它仍然不会解决这个问题。另外,ZF将数据作为对象返回给我,所以我不能使用'$ data [$ i]' – lkartono 2013-04-04 08:09:59