php实现分类
PHP实现分类的方法
数据库设计
创建分类表通常需要包含id、名称、父级id等字段。以下是一个基本的SQL示例:
CREATE TABLE categories (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
parent_id INT DEFAULT NULL,
FOREIGN KEY (parent_id) REFERENCES categories(id) ON DELETE CASCADE
);
递归获取分类树
使用递归函数获取无限级分类结构:

function getCategories($parentId = null) {
$categories = [];
$query = "SELECT * FROM categories WHERE parent_id " . ($parentId ? "= $parentId" : "IS NULL");
$result = mysqli_query($connection, $query);
while ($row = mysqli_fetch_assoc($result)) {
$row['children'] = getCategories($row['id']);
$categories[] = $row;
}
return $categories;
}
分类展示
在HTML中展示分类可以使用嵌套列表:

function displayCategories($categories) {
echo '<ul>';
foreach ($categories as $category) {
echo '<li>' . htmlspecialchars($category['name']);
if (!empty($category['children'])) {
displayCategories($category['children']);
}
echo '</li>';
}
echo '</ul>';
}
添加分类
实现添加分类的表单处理:
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = $_POST['name'];
$parentId = $_POST['parent_id'] ?: null;
$stmt = $pdo->prepare("INSERT INTO categories (name, parent_id) VALUES (?, ?)");
$stmt->execute([$name, $parentId]);
}
使用ORM实现
使用Laravel的Eloquent模型可以简化操作:
class Category extends Model {
public function children() {
return $this->hasMany(Category::class, 'parent_id');
}
public function parent() {
return $this->belongsTo(Category::class, 'parent_id');
}
}
// 获取所有分类
$categories = Category::with('children')->whereNull('parent_id')->get();
性能优化
对于大型分类系统,可以考虑使用闭包表(Closure Table)或嵌套集(Nested Set)模型来提高查询效率。闭包表需要额外维护一个关系表,但查询更加灵活高效。






