DSk*_*ner 36 php arrays tree flat
我环顾互联网,并没有找到我正在寻找的东西.我有一个扁平数组,每个元素都包含'id'和'parent_id'.每个元素只有一个父元素,但可能有多个子元素.如果parent_id = 0,则将其视为根级别项.我想把我的扁平阵列变成一棵树.我发现的其他样本只将元素复制到父元素,但原始元素仍然存在.
编辑
从单独的XML文件中读取起始数组的每个元素.如果父文件没有父文件,则文件本身将具有'0'作为parent_id的值.键实际上是字符串.
我很抱歉早先的混乱.希望这更清楚:
/编辑
我的起始阵列:
Array
(
[_319_] => Array
(
[id] => 0
[parent_id] => 0
)
[_320_] => Array
(
[id] => _320_
[parent_id] => 0
)
[_321_] => Array
(
[id] => _321_
[parent_id] => _320_
)
[_322_] => Array
(
[id] => _322_
[parent_id] => _321_
)
[_323_] => Array
(
[id] => _323_
[parent_id] => 0
)
[_324_] => Array
(
[id] => _324_
[parent_id] => _323_
)
[_325_] => Array
(
[id] => _325_
[parent_id] => _320_
)
)
树形成后的结果数组:
Array
(
[_319_] => Array
(
[id] => _319_
[parent_id] => 0
)
[_320_] => Array
(
[id] => _320_
[parent_id] => 0
[children] => Array
(
[_321_] => Array
(
[id] => _321_
[parent_id] => _320_
[children] => Array
(
[_322_] => Array
(
[id] => _322_
[parent_id] => _321_
)
)
)
[_325_] => Array
(
[id] => _325_
[parent_id] => _320_
)
)
[_323_] => Array
(
[id] => _323_
[parent_id] => 0
[children] => Array
(
[_324_] => Array
(
[id] => _324_
[parent_id] => _323_
)
)
)
非常感谢任何帮助/指导!
到目前为止我有一些代码:
function buildTree(array &$elements, $parentId = 0) {
$branch = array();
foreach ($elements as $element) {
if ($element['parent_id'] == $parentId) {
$children = $this->buildTree($elements, $element['id']);
if ($children) {
$element['children'] = $children;
}
$branch[] = $element;
}
}
return $branch;
}
n0n*_*g0n 53
你忘了unset()那里兄弟.
function buildTree(array &$elements, $parentId = 0) {
$branch = array();
foreach ($elements as $element) {
if ($element['parent_id'] == $parentId) {
$children = buildTree($elements, $element['id']);
if ($children) {
$element['children'] = $children;
}
$branch[$element['id']] = $element;
unset($elements[$element['id']]);
}
}
return $branch;
}
Run Code Online (Sandbox Code Playgroud)
Ste*_*son 28
然而,ImmortalFirefly的解决方案正在发挥作用,正如mdded指出的那样,它没有拯救没有孩子的第一个父母.我编辑了修复此问题的函数:
function buildTree(array &$elements, $parentId = 0) {
$branch = array();
foreach ($elements as &$element) {
if ($element['parent_id'] == $parentId) {
$children = buildTree($elements, $element['id']);
if ($children) {
$element['children'] = $children;
}
$branch[$element['id']] = $element;
unset($element);
}
}
return $branch;
}
Run Code Online (Sandbox Code Playgroud)
这对我有用:
$index=array();
$tree=array();
foreach ($ori as $key=>$var) {
$var=array_shift($ori);
if ($var['id']==0) $var['id']=$key;
if ((string)$var['parent_id']==='0') {
$tree[$key]=$var;
$index[$key]=&$tree[$key];
} else if (isset($index[$var['parent_id']])) {
if (!isset($index[$var['parent_id']]['children'])) $index[$var['parent_id']]['children']=array();
$index[$var['parent_id']]['children'][$key]=$var;
$index[$key]=&$index[$var['parent_id']]['children'][$key];
} else {
array_push($ori,$var);
}
}
unset($index);
print_r($tree);
Run Code Online (Sandbox Code Playgroud)