php实现分类效果
使用数组实现分类
在PHP中可以通过多维数组来组织分类数据。定义一个包含分类信息的数组,每个分类可以包含子分类。
$categories = [
'电子产品' => [
'手机',
'电脑',
'平板'
],
'服装' => [
'男装',
'女装',
'童装'
]
];
遍历数组显示分类:
foreach($categories as $category => $subcategories) {
echo "<h3>$category</h3>";
echo "<ul>";
foreach($subcategories as $subcategory) {
echo "<li>$subcategory</li>";
}
echo "</ul>";
}
数据库存储分类结构
更实用的方案是使用数据库存储分类数据。创建categories表:
CREATE TABLE categories (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
parent_id INT DEFAULT NULL,
FOREIGN KEY (parent_id) REFERENCES categories(id)
);
插入示例数据:
INSERT INTO categories (name, parent_id) VALUES
('电子产品', NULL),
('服装', NULL),
('手机', 1),
('电脑', 1),
('男装', 2),
('女装', 2);
递归查询分类树
从数据库获取分类并构建树形结构:
function buildCategoryTree($parentId = null) {
$tree = [];
$sql = "SELECT * FROM categories WHERE parent_id " . ($parentId ? "= $parentId" : "IS NULL");
$result = $pdo->query($sql);
while($row = $result->fetch()) {
$node = [
'id' => $row['id'],
'name' => $row['name'],
'children' => buildCategoryTree($row['id'])
];
$tree[] = $node;
}
return $tree;
}
$categoryTree = buildCategoryTree();
print_r($categoryTree);
使用ORM实现分类
使用Eloquent ORM可以更简洁地实现分类关系:
class Category extends Model {
public function parent() {
return $this->belongsTo(Category::class, 'parent_id');
}
public function children() {
return $this->hasMany(Category::class, 'parent_id');
}
}
// 获取顶级分类及其子分类
$categories = Category::with('children')
->whereNull('parent_id')
->get();
分类URL路由处理
为分类创建友好的URL路由:
// routes/web.php
Route::get('/category/{slug}', function($slug) {
$category = Category::where('slug', $slug)->firstOrFail();
return view('category', ['category' => $category]);
});
分类缓存优化
对分类数据进行缓存提高性能:
$categories = Cache::remember('categories', 3600, function() {
return Category::with('children')
->whereNull('parent_id')
->get();
});
无限级分类展示
在前端展示无限级分类菜单:
function renderCategoryMenu($categories, $level = 0) {
$indent = str_repeat(' ', $level * 4);
echo '<ul>';
foreach($categories as $category) {
echo "<li>{$indent}{$category['name']}";
if(!empty($category['children'])) {
renderCategoryMenu($category['children'], $level + 1);
}
echo '</li>';
}
echo '</ul>';
}
renderCategoryMenu($categoryTree);






