我正在尝试优化具有无限类别深度的电子商务类别系统(除非系统内存限制)。我一次检索所有类别并将它们排序为一个多维数组,大致如下所示:
[array] (
[0] (
'CategoryId' => 1,
'ParentCategoryId' => 0,
'Title' => 'Category A',
'SubCategories' => [array] (
[0] (
'CategoryId' => 2,
'ParentCategoryId' => 1,
'Title' => 'Category B',
'SubCategories' => [array] (
[0] (
'CategoryId' => 3,
'ParentCategoryId' => 2,
'Title' => 'Category C'
)
)
)
)
)
)
数组中的每一项实际上都是一个对象,但为了简单起见,我把它写出来有点像数组格式。
我可以使用这个函数向下遍历我的树:
/**
* Find Branch using Recursive search by Object Key
* @param String Needle
* @param Array Haystack
* @return Array
*/
public static function findBranchByKey($key, $needle, $haystack)
{
foreach ($haystack as $item)
{
if ( $item->$key == $needle || ( is_object($item) && $item = self::findBranchByKey($key, $needle, $item->SubCategories)) )
{
return $item;
}
}
return false;
}
这会找到具有匹配键的对象并返回它(可能包含更多子类别)。
我的问题是弄清楚如何穿越另一个方向。例如,使用上面的数据,假设我正在显示“C 类”并且想要创建它的父母的面包屑。我想不出一个好方法来获取我的树数组,跳转到特定的子类别,然后向上迭代以获取每个父级。像这样的结果数组可能是这样的,所以很容易将它们作为面包屑吐出:
array( 'Category A', 'Category B', 'Category C' )
我可能可以在我的数据库中使用 SQL 来执行此操作,但我想检索一次树,将其缓存,并在需要时对该对象执行遍历,而不是进行大量查询。
TL;博士; 如何在多维类别数组中向上遍历?