【发布时间】: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
-
你确定输出数组应该是有问题的吗?一个组不是必须呈现一次吗?