Я создаю древовидную структуру категорий с парентидами, которую дети могут вызывать так:
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>';
}