php 取多级分类,php – 获取所有类别(多级)

该博客探讨了一种使用递归函数加载类别树的方法,但指出这种方法在类别层级深或数量大时可能导致大量数据库查询,从而影响性能。作者建议通过一次性加载所有类别并递归排序来优化,以减少查询次数。同时警告要防止无限循环的风险,确保数据结构的清洁。更新部分提到,早期评估和静态变量缓存可能是处理大型类别树的更好策略。
摘要由CSDN通过智能技术生成

解决问题的最简单方法是添加递归.

public function getCategoryTreeForParentId($parent_id = 0) {

$categories = array();

$this->db->from('categories');

$this->db->where('parent_id', $parent_id);

$result = $this->db->get()->result();

foreach ($result as $mainCategory) {

$category = array();

$category['id'] = $mainCategory->id;

$category['name'] = $mainCategory->name;

$category['parent_id'] = $mainCategory->parent_id;

$category['sub_categories'] = $this->getCategoryTreeForParentId($category['id']);

$categories[$mainCategory->id] = $category;

}

return $categories;

}

通过预加载所有类别并在阵列上操作,可以大大提高此方法,从而跳过每个新parent_id的查询.

我也没有使用codeigniter的对象,因为我不知道它们.如果它们支持魔术setter / getter或者可以说服它们获取一系列子对象,那么应该使用它们来代替我在这里构建的数组.

算法的作用是:使用给定的parent_id加载所有类别,遍历所有这些类别,将iteration-category-id假设为parent_id并为其加载所有内容.

这有效地加载所有类别,只要它们引用现有类别.

涉及到一个轻微的危险:当您构建类别A和B时,其中A将B作为父级,B将A作为父级,您将遇到无限循环,因为它们会一次又一次地相互加载.这会强制您在数据中使用干净的树结构.

更新

因为这仍然得到了回报:

有关此实施的另一个建议.

如果您的类别树更大或具有多个级别,则可能会遇到性能问题,因为此实现会使用新的查询参数一次又一次地加载类别.这很容易导致数十,数百或数千个查询,具体取决于您的类别树.

一种更有效的方法是从类别表中加载所有类别(使用一个查询),并在应用程序中使用递归对它们进行排序.这是极少数情况之一,早期评估确实可以提高性能.

如果在同一个请求中需要多次树,那么甚至可以通过静态变量添加缓存(具有缓存的所有常见危险).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值