【问题标题】:PHP reversing parents and children in array treePHP在数组树中反转父母和孩子
【发布时间】:2017-04-19 20:56:05
【问题描述】:

我有一个带有(无穷无尽的)“父母”而不是孩子的数组/树。它看起来像这样:

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,
              ),
            ),
          ),
        ),
      ),
    ),
  ),
)

【问题讨论】:

  • 您可以使用var_export($array) 并更新您的问题,以便我们拥有数组吗?另外,如果你有一个你尝试过的代码块,你也应该把它放上去......
  • 向我们展示您构建此数组时使用的代码。
  • TopLevel、SecondLevel 和 ThirdLevel 的多次出现是否不同元素? (每次都使用相同的名称,相同的组 id。)或者您想要的结果数据结构只是不必要的冗余?
  • 我用一些信息更新了这个问题。它们是相同的元素。 @AntonisTsimourtos 这是一个出口:pastebin.com/0UgGWAtr
  • 你确定输出数组应该是有问题的吗?一个组不是必须呈现一次吗?

标签: php arrays tree


【解决方案1】:
  1. 统计父母总数

    $parents = $this->getGroupParents($group_id);

  2. 在for语句中,逆向存储数组($ret[])

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

  3. 使用关键父=>子

【讨论】:

    猜你喜欢
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    相关资源
    最近更新 更多