我试图在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');
最佳答案
我会帮助你,但我想先说几句话;
数据库设计不正确。如果为每个元素提供parent_id,则应该为顶级父元素提供parent_id0
或在最佳情况下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 } ?>
这就是结果