PHP在阵列树上扭转父母和孩子



我有一个带有(无尽的("父母"而不是孩子的数组/树。看起来这样:

array(5) {
  [0]=>
  array(3) {
    ["group_id"]=>
    int(1)
    ["name"]=>
    string(11) "Toplevel"
    ["parents"]=>
    NULL
  }
  [1]=>
  array(3) {
    ["group_id"]=>
    int(2)
    ["name"]=>
    string(13) "SecondLevel"
    ["parents"]=>
    array(1) {
      [0]=>
      array(3) {
        ["group_id"]=>
        int(1)
        ["name"]=>
        string(11) "Toplevel"
        ["parents"]=>
        NULL
      }
    }
  }
  [2]=>
  array(3) {
    ["group_id"]=>
    int(4)
    ["name"]=>
    string(12) "ThirdLevel"
    ["parents"]=>
    array(2) {
      [0]=>
      array(3) {
        ["group_id"]=>
        int(2)
        ["name"]=>
        string(13) "SecondLevel"
        ["parents"]=>
        array(1) {
          [0]=>
          array(3) {
            ["group_id"]=>
            int(1)
            ["name"]=>
            string(11) "TopLevel"
            ["parents"]=>
            NULL
          }
        }
      }
    }
  }

您可以看到,树结构的顺序是相反的。我想用儿童作为子节点以正确的顺序重建树。看起来应该这样:

array(5) {
  [0]=>
  array(3) {
    ["group_id"]=>
    int(1)
    ["name"]=>
    string(11) "Toplevel"
    ["children"]=>
    NULL
  }
  [1]=>
  array(3) {
    ["group_id"]=>
    int(1)
    ["name"]=>
    string(13) "TopLevel"
    ["children"]=>
    array(1) {
      [0]=>
      array(3) {
        ["group_id"]=>
        int(2)
        ["name"]=>
        string(11) "SecondLevel"
        ["children"]=>
        NULL
      }
    }
  }
  [2]=>
  array(3) {
    ["group_id"]=>
    int(1)
    ["name"]=>
    string(12) "TopLevel"
    ["children"]=>
    array(2) {
      [0]=>
      array(3) {
        ["group_id"]=>
        int(2)
        ["name"]=>
        string(13) "SecondLevel"
        ["children"]=>
        array(1) {
          [0]=>
          array(3) {
            ["group_id"]=>
            int(4)
            ["name"]=>
            string(11) "ThirdLevel"
            ["children"]=>
            NULL
          }
        }
      }
    }
  }

我只是不知道该怎么做。我可以使用任何简单的功能,例如uasort?

更新以回答问题:

由于这个原因,该数组是这样的构建:

  • 用户A可以是不同组的成员
  • 组可以是不同子组的成员
  • 亚组可以是不同的子组的成员(等(

现在,用户A位于第1组和6中。6是5的子组,是4的子组,是3的子组。这意味着,该用户A也是组5,4的成员,3。要获取与用户A相关的每个组,我将寻找他是(1和6(的直接成员,并查找这些组的所有父母(结果为:1,3,4,5,6(具有递归功能:

private function getParentsArray($group_id) {
    $ret=null;
    $parents = $this->getGroupParents($group_id);
    if(!is_null($parents[0])) {
        foreach($parents as $parent) {
            $group = $this->getGroup($parent);
            if(!empty($this->getGroupParents($parent)) && $this->getGroupParents($parent)[0]) {
                $ret[] = array("group_id" => $group["group_id"], "name" => $group["name"], "parents" => $this->getParentsArray($group["group_id"]));
            } else {
                $ret[] = array("group_id" => $group["group_id"], "name" => $group["name"], "parents" => null);
            }
        }
    }
    return $ret;
}

更新2:这是现有数组的var_export,按照要求:

array (
  0 => 
  array (
    'group_id' => 1,
    'name' => 'Toplevel',
    'parents' => NULL,
  ),
  1 => 
  array (
    'group_id' => 2,
    'name' => 'Secondlevel',
    'parents' => 
    array (
      0 => 
      array (
        'group_id' => 1,
        'name' => 'Toplevel',
        'parents' => NULL,
      ),
    ),
  ),
  2 => 
  array (
    'group_id' => 4,
    'name' => 'Thirdlevel',
    'parents' => 
    array (
      0 => 
      array (
        'group_id' => 2,
        'name' => 'Secondlevel',
        'parents' => 
        array (
          0 => 
          array (
            'group_id' => 1,
            'name' => 'Toplevel',
            'parents' => NULL,
          ),
        ),
      ),
      1 => 
      array (
        'group_id' => 3,
        'name' => 'Secondlevel2',
        'parents' => 
        array (
          0 => 
          array (
            'group_id' => 1,
            'name' => 'Toplevel',
            'parents' => NULL,
          ),
        ),
      ),
    ),
  ),
  3 => 
  array (
    'group_id' => 6,
    'name' => 'Firstlevel',
    'parents' => NULL,
  ),
  4 => 
  array (
    'group_id' => 10,
    'name' => 'Forthlevel',
    'parents' => 
    array (
      0 => 
      array (
        'group_id' => 9,
        'name' => 'Thirdlevel2',
        'parents' => 
        array (
          0 => 
          array (
            'group_id' => 7,
            'name' => 'Secondlevel3',
            'parents' => 
            array (
              0 => 
              array (
                'group_id' => 6,
                'name' => 'Firstlevel',
                'parents' => NULL,
              ),
            ),
          ),
        ),
      ),
    ),
  ),
)
  1. 算出总父母

    $ parents = $ this-> getgroupparents($ group_id(;

  2. 在语句中,将阵列($ ret [](存储在反向

    for($ i == count($ parters(; $ i> -1; $ i-({ $ ret [$ i] ='';}

  3. 使用钥匙父=>儿童

最新更新