2016-05-21 4 views
1

私は、無制限の深さで、私にマルチレベルメニューをフェッチするPHPコードを書こうとしています。私は1つのクエリと1つのループでそれを実行できるようにしたい。 は、ここで私が持っているものだ: 私は、次の列を持つmenu_itemsテーブルを持っている:mysql/phpのマルチレベルメニュー

id 
categories_id (overall menu id) 
title (Text title) 
link (Link) 
ord (the order within the category itself) 
parent (Parent item, which is basically another item, different from categories_id) 
depth (Menu level. For whatever reason, I think it's going to help me to know the depth of every particular item) 

すべてのメニュー項目がcategories_idにより特定のメニューにリンクされており、それらのすべてが「親」で彼らの親項目にリンクされていますトップレベルの項目は親に対して0を持つ。

今、私は、ループの1回のパスが素敵な多次元配列でそれらを整理することができるような方法で(同じcategories_idの下で)アイテムの全リストを返すためにmysqlが必要です。

どうすればいいですか? 私はそれをやっていると考えていましたが、すべてのアイテムがすべての子によって処理されるような方法でMySQLにアイテムを注文させることができるかどうかです。私はこのように構成している場合 :たとえば

は、項目1,7および8は、トップレベルの空のアイテムです

Item 1 
Item 2 
    Item 3 
    Item 4 
     Item 5 
    Item 6 
Item 7 
Item 8 

を、項目2には3人の子供を持っており、サブアイテム4は、その子として項目5を持ってい

上記のアイテムをこのように注文するにはmysqlが必要です: アイテム1、アイテム2、アイテム2には子があるので、アイテム3と4を出力する必要があります。アイテム5、アイテム6に戻ります...など...

これを注文する方法はありますか?それとも別のやり方で達成できますか?

申し訳ありませんが、私の質問はちょっと混乱しています。

+0

階層的なデータ構造についてはかなり簡単に説明できます:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ –

答えて

1

すべてを1つのクエリで読み込みたい場合は、メニューに何千ものアイテムが含まれていない可能性が高いため、SQLクエリを過度に複雑化するのではなく、PHPを使用してタスクを単純化してください。

$items = query('SELECT * FROM `menu_items` WHERE categories_id = ? ORDER BY `ord` asc'); 

順序はサブメニューにすべての項目を分割して保存されるそのように:

だから最初にあなただけの最も単純なクエリですべてをロードします。次に、メニュー構造を構築するためにループが1つ必要です。

$itemsById = []; 
$children = []; 
foreach ($items as $item) { 
    $itemsById[$item['id']] = $item; 
    $children[$item['parent']][] = $item['id']; 
} 

そして、あなたはそれが再帰的に$children[0]から始まる印刷することができます。

関連する問題