-1

次のようなサブメニューを含む水平メニューを作成できる JavaScript コードがあります。

<ul id="menu">
<li>Menu 1
  <ul>
   <li>Sub Menu 1</li>
  </ul>
</li>
</ul>

必要な数のサブ メニューを作成できます。問題は、PHP を使用して MySQL データベースからリンクを取得していて、サブ メニューを手動で何度もチェックせずにこれらのサブ メニューを動的に構築する方法がわからないことです。 . たとえば、MySQL テーブルでは次のようになります。

フィールド: Menu_ID Menu_Name Menu_Link Menu_ParentID

したがって、メニュー ID は単なる自動インクリメントであり、menu_parentid を使用すると、サブメニュー名/リンクを親メニューに割り当てることができます。しかし、それを行うために、現在2つのサブメニューチェックのためにこれを行っています:

$query = "SELECT * FROM site_menu WHERE Menu_ParentID = 0";

foreach($query AS $q)
{
//run through the results
$query2 = "SELECT * FROM site_menu WHERE Menu_ParentID = $q['id']";

foreach($query2 AS $q2)
{
//run through the results
}
}

ご覧のとおり、最初のサブ メニューだけを取得するために 2 回クエリを実行する必要がありますが、3 番目のサブ メニューがある場合はどうでしょうか。3 つのクエリを実行する必要がありますか? 助言がありますか?

4

6 に答える 6

0

これは、データベースで一度だけ実行され、単純な再帰関数を使用して配列を階層化する例です。

# table
CREATE TABLE foo (
    menu_id int not null auto_increment primary key, 
    menu_name varchar(255) not null, 
    menu_link varchar(255) not null default '#',
    menu_parent_id int not null default 0
);

# data 
INSERT INTO `test`.`foo`
    (`menu_id`,`menu_name`,`menu_link`,`menu_parent_id`)
VALUES
    (1, 'Catalog', '#', 0),
    (2, 'Reports', '#', 0),
    (3, 'Products', '#', 1),
    (4, 'Sales', '#', 2),
    (5, 'Customers', '#', 2),
    (6, 'Tvs', '#', 3);

これがあなたのphpコードです:

<?php
$db = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '****');

$stmt = $db->query("SELECT * FROM foo");
$resultSet = $stmt->fetchAll(PDO::FETCH_ASSOC);


$setMenu = function ($data, $index = 0) use (&$setMenu){
                $menu = array();

        foreach ($data as $row) {
            if ((int) $row['menu_parent_id'] !== $index)
                continue;

            $menu[$row['menu_id']] = array(
                'name' => $row['menu_name'],
                'link' => $row['menu_link'],
                'submenus' => $setMenu($data, (int) $row['menu_id']),
            );
        }

        return $menu;
};

// your menu 
$menu = $setMenu($resultSet, 0);

var_export($menu);

それはあなたのリスト(ul)に入る準備ができている情報をあなたに与えるつもりです。

乾杯!

于 2013-04-18T04:02:02.693 に答える
0

Web サイトのナビゲーション ツリーを格納するための最適な手法は、ネスト セット モデルと呼ばれます。

ここに良い実装例があります: mysql でネストされたセットを扱う?

于 2013-04-18T04:16:24.630 に答える
0

メニュー テーブルに並べ替えまたは順序の列を配置することをお勧めします。その後、並べ替え列を使用してすべての結果を引き出すことができます。これにより、メニューのトップ レベルを並べて、サブ メニュー項目を相互に並べることができます。

これにより、データベースの結果を使用してループを 1 つだけ作成し、parent_id が入力されているかどうかに基づいて、メニューのどのセクションを書き込むかを選択できます。

于 2013-04-18T02:01:01.837 に答える