2017-07-12 10 views
1

PHPでマルチレベルメニューのリストを生成しようとしていますが、その方法はわかりません。簡単な例とカテゴリを分類するのに役立ちますPHPで配列をソートしてマルチレベルのメニューリストを生成する

<ul> 
    <li>Category 1</li> 
    <li> 
    <h4>TITLE HERE</h4> 
    <ul> 
     <li>Category Child 1</li> 
     <li>Category Child 2</li> 
     <li>Category Child 3</li> 
     <li> 
     <h4>TITLE HERE</h4> 
     <ul> 
      <li>Category child 1</li> 
      <li>Category child 2</li> 
      <li>Category child 3</li> 
     </ul> 
     </li> 
    </ul> 
    </li> 
    <li>Category 1</li> 
    <li>Category 2</li> 
    <li>Category 3</li> 
</ul> 

私はPHPの配列があります:

$data = Array (
    '0' => Array (
     'id' => '1', 
     'id_parent' => '', 
     'name' => 'Sports' 
), 

    '1' => Array (
     'id' => '2', 
     'id_parent' => '1', 
     'name' => 'Football' 
), 

    '2' => Array (
     'id' => '3', 
     'id_parent' => '1', 
     'name' => 'Bascket' 
), 

    '3' => Array (
     'id' => '4', 
     'id_parent' => '', 
     'name' => 'Health' 
), 

    '4' => Array (
     'id' => '5', 
     'id_parent' => '4', 
     'name' => 'Nutrition and diet' 
), 

    '5' => Array (
     'id' => '6', 
     'id_parent' => '4', 
     'name' => 'Beauty Salon' 
), 

    '6' => Array (
     'id' => '7', 
     'id_parent' => '', 
     'name' => 'Films' 
), 

    '7' => Array (
     'id' => '8', 
     'id_parent' => '7', 
     'name' => 'Armageddon' 
), 

    '8' => Array (
     'id' => '9', 
     'id_parent' => '7', 
     'name' => 'Apocalypse' 
), 

    '9' => Array (
     'id' => '10', 
     'id_parent' => '', 
     'name' => 'News' 
), 

    '10' => Array (
     'id' => '11', 
     'id_parent' => '10', 
     'name' => 'International' 
), 

    '11' => Array (
     'id' => '12', 
     'id_parent' => '11', 
     'name' => 'News from Syria' 
), 

    '12' => Array (
     'id' => '13', 
     'id_parent' => '11', 
     'name' => 'News from Palestine' 
) 
); 

を私はMySQLでのテーブルを持っている彼らのタイトル、このような何かを持つカテゴリ

CREATE TABLE `categories` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `id_parent` mediumint(8) unsigned DEFAULT NULL, `name` varchar(100) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `FK_categories_UNIQUE` (`name`), KEY `FK_categories` (`id_parent`), CONSTRAINT `FK_categories` FOREIGN KEY (`id_parent`) REFERENCES `categories` (`id`) ON UPDATE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of categories -- ---------------------------- INSERT INTO `categories` VALUES ('1', null, 'Sports'); INSERT INTO `categories` VALUES ('2', '1', 'Football'); INSERT INTO `categories` VALUES ('3', '1', 'Bascket'); INSERT INTO `categories` VALUES ('4', null, 'Health'); INSERT INTO `categories` VALUES ('5', '4', 'Nutrition and diet'); INSERT INTO `categories` VALUES ('6', '4', 'Beauty Salon'); INSERT INTO `categories` VALUES ('7', null, 'Films'); INSERT INTO `categories` VALUES ('8', '7', 'Armageddon'); INSERT INTO `categories` VALUES ('9', '7', 'Apocalypse'); INSERT INTO `categories` VALUES ('10', null, 'News'); INSERT INTO `categories` VALUES ('11', '10', 'International'); INSERT INTO `categories` VALUES ('12', '11', 'News from Syria'); INSERT INTO `categories` VALUES ('13', '11', 'News from Palestine'); 

ご協力いただきありがとうございます。

+0

結果であるあなたは、HTMLの構造のようなツリーに値を表示したいですか? – user10089632

+0

@ Lambda7 HTML構造で表示する場合 –

+0

カテゴリのレベル数に制限はありますか?もしそうなら、あなたはSQLを介して、そして順番にレコードを得ることができます。次に、ブレークソートを行ってHTML出力を生成します。 –

答えて

1

私はあなたを助けるつもりですが、私は最初にいくつかのことを言いたいと思います。

データベース設計が正しくありません。 parent_idに各要素を指定する場合は、parent_idには0を指定するか、最善のケースでは最上位の親に対してnullを指定する必要があります。 そのようにすれば、最初にforeachを減らし、メインカテゴリを自動的に取得することができます。 多分あなたはいくつかの価値を持っているかもしれませんが、将来的には、何千ものニュース、カテゴリ、すべてのデータをループしなければならないときは、この考え方を考慮する必要があります。とにかくここ

はあなたのコードが

$parents = array(); 

foreach ($data as $key => $item) { 
    if($item['id_parent'] === '') { 
     $parents[$key] = $item; 
    } 
} 

?> 

<ul> 

<?php foreach ($parents as $parent) { ?> 
    <li> <?php $parent['name'] ?> </li> 
    <ul> 
    <?php foreach ($data as $key => $item) { ?> 
     <?php if ($parent['id'] == $item['id_parent']) { ?> 
     <li> <?php $item['name'] ?> </li> 
     <?php } ?> 
    <?php } ?> 
    </ul> 
<?php } ?> 

であり、これは

enter image description here

+0

あなたの助けを借りてありがとう、あなたの例はシンプルで非常に説明的ですが、カテゴリーの子どものカテゴリーを表示することは可能でしょう "これを変更せずに、それを第2のフォームとして追加する"ネイティブのPHP関数http://php.net/manual/es/ref.array.phpを使用してこれを行うにはより多くの方法があるかどうかを知りたいのですが、この答えを変更しないでください。これは非常に便利です。 –

関連する問題