2012-01-07 11 views
0

がどのように私は、このHTMLコードをビルドすることができます。ネストされた順不同リストを使用してツリーを構築

<ul class="tree"> 
    <li>Animals 
     <ul> 
      <li>Birds</li> 
      <li>Mammals 
       <ul> 
        <li>Elephant</li> 
        <li>Mouse</li> 
       </ul> 
      </li> 
      <li>Reptiles</li> 
     </ul> 
    </li> 
    <li>Plants 
     <ul> 
      <li>Flowers 
       <ul> 
        <li>Rose</li> 
        <li>Tulip</li> 
       </ul> 
      </li> 
      <li>Trees</li> 
     </ul> 
    </li> 
</ul> 

この構造からの:

CREATE TABLE `categories` (
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `position` INT(11) DEFAULT NULL, 
    `parent_id` INT(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `parent_id_fk` (`parent_id`), 
    CONSTRAINT `categories_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `categories` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

INSERT INTO `categories` (`id`, `position`, `parent_id`) 
VALUES 
    (1,1,NULL), 
    (2,2,NULL), 
    (3,1,1), 
    (4,2,1), 
    (5,1,4), 
    (6,2,4), 
    (7,3,1), 
    (8,1,2), 
    (9,1,8), 
    (10,2,8), 
    (11,2,2); 

CREATE TABLE `categories_locale` (
    `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `slug` VARCHAR(100) NOT NULL DEFAULT '', 
    `name` VARCHAR(40) NOT NULL DEFAULT '', 
    `path_cache` text, 
    `category_id` INT(11) NOT NULL, 
    `locale_id` SMALLINT(5) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

INSERT INTO `categories_locale` (`id`, `slug`, `name`, `path_cache`, `category_id`, `locale_id`) 
VALUES 
    (1,'animals','Animals',NULL,1,1), 
    (2,'plants','Plants',NULL,2,1), 
    (3,'birds','Birds',NULL,3,1), 
    (4,'mammals','Mammals',NULL,4,1), 
    (5,'elephant','Elephant',NULL,5,1), 
    (6,'mouse','Mouse',NULL,6,1), 
    (7,'reptiles','Reptiles',NULL,7,1), 
    (8,'flowers','Flowers',NULL,8,1), 
    (9,'rose','Rose',NULL,9,1), 
    (10,'tulip','Tulip',NULL,10,1), 
    (11,'trees','Trees',NULL,11,1); 
+0

あまり。私はSQLとHTMLを構築した後に立ち往生しています。私はそれをどうやって行うのか分かりません。 – oaziz

+1

これはあなたが始めるのを助けるかもしれませんhttp://stackoverflow.com/questions/5291054/hierarchical-sql-problem/5291159#5291159 –

答えて

1

うーん、私はあなたがこれを達成することができますどのようにオンラインで利用例が存在しなければならないと考えています。階層的なデータを格納する新しい方法について話す人もいれば、読み物が面白いと感じる人もいます。

とにかく、再帰に基づいて、このコードスニペットは、あなたのHTMLを達成するのを助けるかもしれません。

<?php 
// recursive function to generate the category HTML 
function generateTree ($parent) { 
    global $arrPCat, $arrCat; 
    if (array_key_exists($parent, $arrPCat)) { 
     echo '<ul' . ($parent == 0 ? ' class="tree"' : '') . '>'; 
     foreach ($arrPCat[$parent] as $arrC) { 
      echo '<li>' . $arrC['name'] . '</li>'; 
      generateTree($arrC['id']); 
     } 
     echo '</ul>'; 
    } 
} 

// read all categories from the DB 
$rs = mysql_query('SELECT `cl`.`id`, `cl`.`name`, `c`.`position`, IFNULL(`c`.`parent_id`, 0) AS `parent_id` 
    FROM `categories_locale` `cl` 
    LEFT JOIN `categories` `c` ON `cl`.`id` = `c`.`id` 
    ORDER BY `c`.`parent_id` , `c`.`position`'); 
while ($r = mysql_fetch_assoc($rs)) { 
    // store parent and its children into the $arrPCat Array 
    $arrPCat[$r['parent_id']][] = Array (
            'id' => $r['id'], 
            'name' => $r['name'] 
           ); 
} 
generateTree (0); // now generate the HTML for the category tree 
?> 

希望すると助かります!

+0

非常に参考になりました、ありがとう。 – oaziz

+0

これは、複数のSQLクエリを必要とするため、ツリーを構築するにはかなり難しい方法です。より良いオプションは、1つのクエリですべてのカテゴリを取得し、PHP配列関数を使用してツリーを構築することです。上記のコードは、最終的なHTMLをキャッシュし、これを一時ファイルから読み取ることで改善することができます。 –

+0

@AlexHolsgrove、上記のコードは複数のクエリではなく単一のクエリを実行します。私があなたを正しく理解しているかどうかわからない – Abhay

0

は、深さ優先探索を使用して、PHPで実際のツリーを構築してみHTMLを生成する。

0

私はAbhayの答えに出くわすのに少しの誤差があります。彼のソリューションは、私が彼のソリューションを実装するときに少なくとも、LIをネストさせたものではありません。しかし、その迅速な修正。再帰呼び出しが行われた後に、閉じるliタグをエコーする必要があります。これにより、すべてのリスト項目は、終了する前にサブ項目を持たなくても完全に作成することができます。

アブヘイのコード:

foreach ($arrPCat[$parent] as $arrC) { 
     echo '<li>' . $arrC['name'] . '</li>'; 
     generateTree($arrC['id']); 
    } 

補正:

foreach ($arrPCat[$parent] as $arrC) { 
     echo '<li>' . $arrC['name'] ; 
     generateTree($arrC['id']); 
     echo '</li>'; 
    } 
関連する問題