データベースからメニューを表示する際にヘルプが必要です。私は成功し、次のコードから、メニューツリー開発した再帰関数、親、子、兄弟だけの動的メニューを表示する
global $menuItems;
$menuItems = array(
[
'id' => 1,
'name' =>
'Main Menu 1',
'main' => 1,
'parent_id' => null
],
['id' => 9,'name' => 'Main Menu 2','main' => 1,'parent_id' => null],
['id' => 10,'name' => 'Main Menu 3','main' => 1,'parent_id' => null],
['id' => 11,'name' => 'Sub Menu 1.1','main' => null,'parent_id' => 1],
['id' => 12,'name' => 'Sub Menu 1.2','main' => null,'parent_id' => 1],
['id' => 13,'name' => 'Sub Menu 1.3','main' => null,'parent_id' => 1],
['id' => 14,'name' => 'Sub Menu 1.2.1','main' => null,'parent_id' => 12],
['id' => 15,'name' => 'Sub Menu 1.2.1','main' => null,'parent_id' => 12],
['id' => 16,'name' => 'Sub Menu 3.1','main' => null,'parent_id' => 10,],
['id' => 17,'name' => 'Sub Menu 3.2','main' => null,'parent_id' => 10],
['id' => 18,'name' => 'Sub Menu 3.2.1','main' => null,'parent_id' => 17],
['id' => 19,'name' => 'Sub Menu 3.2.2','main' => null,'parent_id' => 17]);
:
foreach ($menuItems as $menu) {
$parentsIds[$menu['id']] = $menu['parent_id'];
}
function parseAndPrintTree($root, $tree) {
global $menuItems;
$return = array();
if(!is_null($tree) && count($tree) > 0) {
echo '<ul>';
foreach($tree as $child => $parent) {
if($parent == $root) {
unset($tree[$child]);
foreach ($menuItems as $row) {
if($row['id'] == $child)
echo "<li><a href='?menu=".$row['id']."'>".$row['name']. </a>";
}
parseAndPrintTree($child, $tree);
echo '</li>';
}
}
echo '</ul>';
}
}
parseAndPrintTree(0,$parentsIds);
それは、所望の出力を印刷し は、ここでは、データベーステーブルから配列の結果です。私は必要なもの
メニューがクリックするたびに、
- そのすべての子(クリックまで印刷されてはならない多くの子供を持つ場合)
- すべての兄弟
- ですそしてその親は根元に戻る
parent_id=0
"on" 「ly」はparent_idが0である(子供ではない)他のメインメニューと共に画面に表示されます。
次の出力を生成する必要があります(手順)。最初のステップ1で
: "メインメニュー1" をクリック
:
: "サブメニュー1.2" をクリック
"メインメニュー3"
をクリックすると、 "サブメニュー3.2"
、クリックされたとき、私は両親とCHILDESを取得するため?menu={$row['id']}
を渡すことが、理解できないのですすべての兄弟、親、子どもをどのように扱うか。
私はループ内のidとループ内のidを比較することを試みましたが、1つのレベルで大丈夫ですが、ツリーが2番目のレベルになると、最初の親(ルートに戻る)は印刷されません。
jQuery、Css(クラス)ではなくPHPでのみ必要です。私はしたくないのでプリント他のメニューは画面上に隠れているだけではありません。
わからない以下のコードで上に行く:親に自分のアレイへの完全なパスを追加し、 (例えば、最初に再帰を実行するなどして)ノード自体に送信します。ノードがその値から始まって、選択されたノードの値で始まる場合にのみ、ノードを表示します(そして再帰的に再帰します)。例: 3.2.1の場合、ノードの値は「3.2.1」、親の値は「3.2」になります。ここで、選択したノード値がテスト対象ノードの親値で始まるノードのみを表示します(例:3.1の親パスは「3」、「3.2.1」は「3」で始まります)。 .2 "の親=" 3.1 "は" 3.2.1 "にありません) – Solarflare
私はメニューの例を書いていますが、これは実際にはカテゴリに使用されます。その子カテゴリなどがあります。親にフルパスを追加すると、そのカテゴリが削除されるときにそのパスも更新する必要があります。だから私は問題を解決し、その複雑さを保存する可能な限り再帰でこれを見いだしています。 –
はい、私はあなたがこれを再帰的に最初にやり直すことができたと言いました。一度だけ実行してパスを更新し(毎回または変更後にのみ)、別の再帰を実行して表示します。残念ながら、再帰を使用する場合は、1つの再帰だけで作業することはできません。もちろん、ノードの親があなたのdestノードを子として持つかどうかをテストする関数を書くことはできますが、これは再帰として機能し、遅くなります(より頻繁に実行されます)。実際にデータベースを使用している場合は、ネストされたセットを使用することができます(基本的にパスを提供します)が、兄弟はまだ問題がある可能性があります。 – Solarflare