下面是关于“PHP实现无限分类的实现方法”的完整攻略。
什么是无限分类
无限分类是一种大量应用在商品分类、新闻分类、博客分类等网站中的分类方式。其特点是分类之间具有天然的层级结构,即分类中可以含有子分类,子分类中又可以包含子分类,如此无限循环。
无限分类的实现方法
数据表设计
首先,在数据库中需要设计一张表来存储分类信息,下面是一份示例表:
CREATE TABLE `category` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT '',
`parent_id` int(11) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `parent_id` (`parent_id`),
CONSTRAINT `category_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `category` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
其中,该表包含以下几个字段:
- id:分类ID,为自增字段,唯一标识每个分类。
- name:分类名称,不能为空,用于展示分类的名称。
- parent_id:父级分类ID,用于表示该分类的父分类,如果该分类是一级分类,则parent_id为0。
递归查询
接下来,我们需要通过PHP代码来实现展示无限分类的功能。这里提供一种递归查询的方式。
function display_categories($categories, $parent_id = 0, $indent = '') {
$has_children = false;
foreach ($categories as $category) {
if ($category['parent_id'] == $parent_id) {
if (!$has_children) {
echo "$indent<ul>\n";
$indent .= " ";
$has_children = true;
}
echo "$indent<li>" . htmlspecialchars($category['name'], ENT_QUOTES) . "</li>\n";
display_categories($categories, $category['id'], $indent);
}
}
if ($has_children) {
echo "$indent</ul>\n";
}
}
该函数会通过查询从数据库中获取的分类信息来展示一个完整的无限分类菜单。
其中,$categories参数为从数据库中查询到的所有分类信息,$parent_id为当前分类的父级分类ID,$indent参数表示每个子分类需要在父分类前添加的缩进空格数。
我们通过循环遍历所有分类信息,如果当前分类的parent_id等于$parent_id时,表示该分类是当前父级分类的子分类,则在HTML中添加一个li元素,并递归调用该函数,再次遍历所有分类信息并在该子分类前添加缩进。
使用闭包表达式查询
除了递归查询的方式,还可以使用闭包表达式查询展示无限分类。
function display_categories($categories) {
$grouped = array_reduce($categories, function (&$result, $category) {
$result[$category['parent_id']][] = $category;
return $result;
}, []);
$traverse = function ($categories, $parent_id = 0, $depth = 0) use (&$traverse) {
if (!isset($categories[$parent_id])) {
return;
}
foreach ($categories[$parent_id] as $category) {
echo str_repeat('-', $depth) . htmlspecialchars($category['name'], ENT_QUOTES) . "\n";
$traverse($categories, $category['id'], $depth + 1);
}
};
$traverse($grouped);
}
该方法首先将所有分类信息按照parent_id进行分组,并使用array_reduce函数来实现。接下来,函数定义了一个名为$traverse的闭包表达式,用于递归遍历所有分类信息并输出HTML。
示例说明
以下是一份示例:
// 示例数据
$categories = [
['id' => 1, 'name' => 'PHP编程语言', 'parent_id' => 0],
['id' => 2, 'name' => 'Java编程语言', 'parent_id' => 0],
['id' => 3, 'name' => 'Python编程语言', 'parent_id' => 0],
['id' => 4, 'name' => 'Laravel5框架', 'parent_id' => 1],
['id' => 5, 'name' => 'Yii2框架', 'parent_id' => 1],
['id' => 6, 'name' => 'Spring框架', 'parent_id' => 2],
['id' => 7, 'name' => 'Django框架', 'parent_id' => 3],
['id' => 8, 'name' => 'Flask框架', 'parent_id' => 3],
['id' => 9, 'name' => 'Lumen框架', 'parent_id' => 1],
];
// 输出无限分类菜单
display_categories($categories);
对于该示例数据,递归查询方法的输出如下:
<ul>
<li>PHP编程语言</li>
<ul>
<li>Laravel5框架</li>
<li>Yii2框架</li>
<li>Lumen框架</li>
</ul>
<li>Java编程语言</li>
<ul>
<li>Spring框架</li>
</ul>
<li>Python编程语言</li>
<ul>
<li>Django框架</li>
<li>Flask框架</li>
</ul>
</ul>
使用闭包表达式查询方法的输出如下:
PHP编程语言
--Laravel5框架
--Yii2框架
--Lumen框架
Java编程语言
--Spring框架
Python编程语言
--Django框架
--Flask框架
至此,关于“PHP实现无限分类的实现方法”的完整攻略讲述完毕。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP实现无限分类的实现方法 - Python技术站