私は、次のように子から呼び出すことができる親IDを持つカテゴリのツリー構造を作成しています。
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の子であることを意味します。
このアイデアを取得しようとすると(->を使用して、どの関係が設定されているかを示します)、ループ関数のために、2年生(1-> 2)にしか到達せず、3年生(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>';
}
変更したいことが2つあります。
- コードに、必要に応じたサイズのツリーを自動的に生成させます。
- whileループでは、$ resultを2回(1回は$ resultとして、もう1回は$ 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>';
}