获得n个深类别树后的多维数组

时间:2016-02-22 13:39:30

标签: php mysql arrays recursion multidimensional-array

我正在尝试制作一个类别树,它接受每个类别的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'这是包含其所有子项的数组,依此类推。

祝你好运!

2 个答案:

答案 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)
    }
  }
}