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