我正在创建一个带有 parentid 的类别的树结构,可以通过以下方式从孩子调用:
ID | Name | ParentID
1 1 0
2 2 1
3 3 2
4 4 1
结果是:
1 = 1
2 = 1 -> 2
3 = 1 -> 2 -> 3
4 = 1 -> 4
这意味着3 是 2 的孩子,这是 1 的孩子。
当试图得到这个想法时(用 -> 来显示设置了什么关系)我只到了二年级(1 -> 2),但没有到三年级(1->2->3),因为循环功能我用它。
//put all ID's in an array
while ($row2 = $connector->fetchArray($result2)){
$id = $row2['ID'];
$parents[$id] = $row2['name'];
}
// show the tree-structure
while ($row = $connector->fetchArray($result)){
if($row['parentid']!=0)echo $parents[$row['parentid']].' -> ';
echo $row['name'].' - ';
echo '<br>';
}
我想改变两件事:
- 让代码根据需要自动生成一个大小合适的树。
- 在 while 循环中,我必须选择 $result 两次(一次作为 $result,一次作为 $result2)才能使其工作。这些 $result 具有完全相同的数据库查询:
SELECT ID,name,parentid FROM categories
从中获取结果。我只想声明一次。
感谢所有好的答案。我采用了最简单、实现代码更少的方法:
$result = $connector->query('SELECT ID,name,parentid FROM categories');
// Get an array containing the results.
$parents = array();
while ($row = $connector->fetchArray($result)){
$id = $row['ID'];
$parents[$id] = array('ID' => $row['ID'],'name' => $row['name'],'parentid' => $row['parentid']);
}
foreach ($parents as $id => $row){
$pid=$id;
$arrTmp= array();
do { // iterate through all parents until top is reached
$arrTmp[]=$pid;
$pid = $parents[$pid]['parentid'];
}while ($pid != 0);
$arrTmp = array_reverse($arrTmp);
foreach($arrTmp as $id){
echo $parents[$id]['name'].' -> ';
}
echo '<br>';
}