如何在PHP / CodeIgniter中构建多维嵌套数组?

时间:2017-04-27 03:46:00

标签: php mysql arrays codeigniter multidimensional-array

假设我有一个表有一个代表树层次的水平记录的表

id         group       parent_group_id
---------  ----------  ---------------
1          Parent 1    NULL
2          Parent 2    NULL
3          Parent 3    NULL
4          Child 1     1
5          Child 2     2
6          Child 3     2
7          Child 4     6

我需要构建一个递归函数来构建一个多维嵌套数组,以便它从" top"首先构建parent_group_ids为NULL的行的顶级数组。快进几次迭代,我期待最终得到像这样的对象

$result = array(
    [0] => array(
        'id' => 1,
        'group' => 'Parent 1',
        'parent_group_id' => NULL,
        'children' => array(
            [0] => array(
                'id' => 4,
                'group' => 'Child 1'
                'parent_group_id' => 1,
                'children' => NULL)),
    [1] => array(
        'id' => 2,
        'group' => 'Parent 2',
        'parent_group_id' => NULL,
        'children' => array(
            [0] => array(
                'id' => 5,
                'group' => 'Child 2'
                'parent_group_id' => 2,
                'children' => NULL),
            [1] => array(
                'id' => 6,
                'group' => 'Child 3'
                'parent_group_id' => 2,
                'children' => array(
                     [0] => array(
                         'id' => 1,
                         'group' => 'Child 4'
                         'parent_group_id' => 6,
                         'children' => NULL)))

构建这样的东西的最佳方法是什么?我需要确保它遍历每个分支"。我猜测它何时获得顶级父母的id,然后继续检查是否存在任何行,其中parent_group_id等于第一次运行中的每个id。 。然后,如果它找到孩子,获取那些孩子的id,然后再次检查以查看孩子是否存在。依此类推,直到它出来以便检查。

我并不精通foreach循环来完成这样的事情。

2 个答案:

答案 0 :(得分:1)

查看此源代码。

我认为这个功能有点类似于你所要求的。

  public function getAreaTree(array $elements, $parentId = null) {
    $branch = array();

    foreach ($elements as $element) {

        if ($element['parent_id'] == $parentId) {

            $children = getAreaTree($elements, $element['id']);

            if ($children) {

                $element['children'] = $children;

            }

            $branch[] = $element;
        }

    }

    return empty($branch) ? null : $branch;
}

答案 1 :(得分:0)

您好我曾经在寻找相同的概念..

使用此代码。这对我有用。

function recursion($parent_id = '') {
        $categories = array();
          $this->db->from('category');
          $this->db->where('parent_id', $parent_id);
          $result = $this->db->get()->result_array();

          if(count($result) > 0) {
              foreach ($result as $c) {
                $child = $this->recursion($c['category_id']);
                if($child) {
                    $c ['children']= $child;
                }
                $categories[] = $c;
              }
          }
          return $categories;

    }

function get_cat() {
            print_r($this->recursion());
    }

这可以提高预加载所有类别的速度,从而跳过每个新parent_id的查询。

此函数的作用:使用给定的parent_id加载所有类别,遍历所有这些类别并递归存储在数组上。

但问题是,这会迫使您拥有类别的干净树结构。

希望它能帮助您解决问题。