我想创建一个带有无限子类别的category-tree-array。无需在foreach循环中嵌套foreach循环。
目标是以正确的顺序拥有一系列类别,我可以将其用于多个其他功能。我需要能够轻松浏览此数组以查找更多基础数据。例如,获取并稍后显示驻留在这些类别中的(博客,页面或产品)项目。
看起来应该是这样的:
Array
(
[0] => Array
(
[url] => url_to_cat
[title] => Top Category 1
[depth] => 0
)
[1] => Array
(
[url] => url_to_cat
[title] => Top Category 2
[depth] => 0
)
[2] => Array
(
[url] => url_to_cat
[title] => Sub Category 1 of Category 2
[depth] => 1
)
[3] => Array
(
[url] => url_to_cat
[title] => Sub Category 2 of Category 2
[depth] => 1
)
[4] => Array
(
[url] => url_to_cat
[title] => Sub Category 1 of Sub Category 2
[depth] => 2
)
)
在这个和其他网站的帮助下,我来到这个函数下面,这是正确的方向,但它让我得到一个多维数组。那将很难显示。
类别表包含以下字段:cat_id,parent_id,title。 网址来自另一个表格,这里并不重要。
function category_list($category_parent_id = 0) {
static $cats;
if (!is_array($cats)) {
$sql = "SELECT * FROM category";
$result = $db->query($sql);
while ($record = $result->fetch_array()) {
$cats[] = $record;
}
}
foreach ($cats as $cat) {
// if not a match, move on
if ((int) $cat['parent'] !== (int) $category_parent_id) {
continue;
}
$item[$i]['url'] = 'url';
$item[$i]['title'] = $cat['title'];
$item[$i]['children'] = category_list($cat['cat_id']);
$list_items[] = $item;
}
return $list_items;
}
最初的$ cats数组:
Array
(
[0] => Array
(
[title] => Top Category 1
[parent] => 0
[cat_id] => 1
)
[1] => Array
(
[title] => Top Category 2
[parent] => 0
[cat_id] => 2
)
[2] => Array
(
[title] => Sub Category 1 of Category 2
[parent] => 2
[cat_id] => 3
)
[3] => Array
(
[title] => Sub Category 2 of Category 2
[parent] => 2
[cat_id] => 4
)
[4] => Array
(
[title] => Sub Sub Category 1 of Sub Category 2
[parent] => 4
[cat_id] => 5
)
[5] => Array
(
[title] => Sub Sub Sub Category 1 of Sub Sub Category 1
[parent] => 5
[cat_id] => 6
)
)
我无法理解如何将子节点包含在主数组中,而不是将它们作为嵌套数组。
我已经搜索过,但在这里找不到合适的解决方案,所以如果结果是重复,我很抱歉。然后我想获得原始问题的链接。
答案 0 :(得分:3)
我找到了它!
解决方案是使数组全局用于存储列表项。
此外,我还为该函数添加了$ level,以便我可以显示每个深度的特定类样式。
最后,函数的递归使用不会作为嵌套的"子数组"存储在数组中,而是传递给我最后返回的全局数组。
这给了我正确的数组:
function category_list($category_parent_id = 0, $level = 0) {
// build our category list only once
static $cats;
global $list_items
if (!is_array($cats)) {
$sql = "SELECT * FROM category";
$result = $db->query($sql);
while ($record = $result->fetch_array()) {
$cats[] = $record;
}
}
foreach ($cats as $cat) {
// if not a match, move on
if ((int) $cat['parent'] !== (int) $category_parent_id) {
continue;
}
$list_items[] = array (
'title' => $cat['title'],
'id' => $cat['cat_id'],
'level'=> $level
);
category_list($cat['cat_id'], $level + 1);
}
return $list_items;
}
注意:在第二次测试中未使用Url,但这与示例无关。
Pfew。最后。