我正在尝试制作一个类别树,它接受每个类别的n个子类别。我从网上获得了一些代码并为我的CI修改了它但我无法得到我想要的确切结果。
我的DB非常简单:
id,parent_id,title
如果parent_id = 0,那么它是主要类别,如果不是,那么它是已保存的类别的子类别。
这是我的方法
struct t_node * delete_first( struct t_node *head )
{
if ( head != NULL )
{
struct t_node *tmp = head;
head = head->next;
free( tmp );
}
return head;
}
它对类别进行了很好的分类 - 我得到了主要的猫和每个孩子的每个子子类别,但我得到的是一维数组:
public function all_categories($parent_id = 0, $categoriesArray = '', $i = 0) {
if(!is_array($categoriesArray))
$categoriesArray = array();
$allCategories = $this->category_model->get_all(['parent_id' => $parent_id]);
foreach($allCategories as $category) {
$categoriesArray[$i] = $category;
$categoriesArray[$i][] = $this->all_categories($category['id'], $categoriesArray);
}
return $categoriesArray;
}
你能告诉我一个方法,以便我可以订购它们,因为每个主要类别都有索引⊂' subs'这是包含其所有子项的数组,依此类推。
祝你好运!
答案 0 :(得分:2)
我认为你必须使用引用:
public function all_categories($parent_id = 0, &$categoriesArray = array()) {
$allCategories = $this->category_model->get_all(['parent_id' => $parent_id]);
foreach($allCategories as $category) {
$categoriesArray[$category['id']] = $category;
$categoriesArray[$category['id']]['childs'] = array();
$this->all_categories($category['id'], $categoriesArray[$category['id']]['childs']);
}
}
$myCategoriesArray = array();
$this->all_categories(0, $myCategoriesArray);
注意:可能有一个错误,递归循环很难用你的大脑^^
答案 1 :(得分:0)
最好的解决方案是使用对象而不是数组来表示递归结构。
一个简单的解决方案四,你的问题是使用一个列表,它将refs存储到所有可能的父节点,并在你的数组中添加children
元素。
执行此操作可能会导致类似以下内容
$ids = array();
$root = array(
'id' => 0,
'children' => array()
);
$ids[0] = &$root;
foreach ($data as $item) {
$id = $item['id'];
$parent_id = (int) $item['parent_id'];
if (isset($ids[$parent_id])) {
if (!isset($ids[$parent_id]['children'])) {
$ids[$parent_id]['children'] = array();
}
$ids[$parent_id]['children'][] = &$item;
}
$ids[$id] = &$item;
unset($item);
}
运行此代码后,$root
在结构树
array(2) {
["id"]=>
int(0)
["children"]=>
array(2) {
[0]=>
&array(3) {
["id"]=>
int(1)
["parent_id"]=>
int(0)
["children"]=>
array(2) {
[0]=>
&array(3) {
["id"]=>
int(2)
["parent_id"]=>
int(1)
["children"]=>
array(1) {
[0]=>
&array(2) {
["id"]=>
int(8)
["parent_id"]=>
int(2)
}
}
}
[1]=>
&array(2) {
["id"]=>
int(5)
["parent_id"]=>
int(1)
}
}
}
[1]=>
&array(2) {
["id"]=>
int(3)
["parent_id"]=>
int(0)
}
}
}