2017-07-12 77 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

嗎? – 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 } ?> 

,這就是結果要在像HTML結構樹,以顯示自己的價值

enter image description here

+0

非常感謝你的幫助,你的例子很簡單,很有說服力,但是可以顯示國際父親類別的孩子的類別,「沒有改變它,把它作爲第二種形式添加」,其他的我會想知道是否有更多的方法使用原生PHP函數http://php.net/manual/es/ref.array.php,但請不要更改這個非常有用的答案。 –