我编写了一个函数,用于将一维数组(邻接列表)转换为多维数组。我正在尝试将枚举路径注入$aCat。
来源(一维)
[2] => Array
(
[id] => 2
[parent_id] => 0
[name] => Cat 1
)
[45] => Array
(
[id] => 45
[parent_id] => 2
[name] => Cat 2
)
[46] => Array
(
[id] => 46
[parent_id] => 2
[name] => Cat 4
)
[47] => Array
(
[id] => 47
[parent_id] => 2
[name] => Cat 5
)
[10] => Array
(
[id] => 10
[parent_id] => 45
[name] => Cat 3
)
我有以下函数将其扩展到多维。
function fnExpandArray($aData){
$aNested = array();
foreach($aData as &$aCat){
if(isset($aData[$aCat['parent_id']])){
$aData[$aCat['parent_id']]['sub'][$aCat['id']] = &$aCat;
} else {
$aNested[$aCat['id']] = &$aCat;
}
}
unset($aCat);
return $aNested;
}
这就是结果。到目前为止非常完美。
[2] => Array
(
[id] => 2
[parent_id] => 0
[name] => Cat 1
[sub] => Array
(
[45] => Array
(
[id] => 45
[parent_id] => 2
[name] => Cat 2
[sub] => Array
(
[10] => Array
(
[id] => 10
[parent_id] => 45
[name] => Cat 3
[sub] => Array ()
)
)
)
[46] => Array
(
[id] => 46
[parent_id] => 2
[name] => Cat 4
[sub] => Array()
)
[47] => Array
(
[id] => 47
[parent_id] => 2
[name] => Cat 5
[sub] => Array()
如何结束:
[2] => Array
(
[id] => 2
[parent_id] => 0
[name] => Cat 1
[path] => 2
[sub] => Array
(
[45] => Array
(
[id] => 45
[parent_id] => 2
[name] => Cat 2
[path] => 2_45
[sub] => Array
(
[10] => Array
(
[id] => 10
[parent_id] => 45
[name] => Cat 3
[path] => 2_45_10
[sub] => Array ()
)
)
)
[46] => Array
(
[id] => 46
[parent_id] => 2
[name] => Cat 4
[path] => 2_46
[sub] => Array()
)
[47] => Array
(
[id] => 47
[parent_id] => 2
[name] => Cat 5
[path] => 2_47
[sub] => Array()
这样修改函数代码:
function fnExpandArray($aData){
$aNested = array();
foreach($aData as &$aCat){
if(isset($aData[$aCat['parent_id']])){
$aData[$aCat['parent_id']]['sub'][$aCat['id']] = &$aCat;
$aData[$aCat['parent_id']]['sub'][$aCat['id']]['path'] = $aData[$aCat['parent_id']]['path'] . '_' . $aCat['id'];
} else {
$aNested[$aCat['id']] = &$aCat;
$aNested[$aCat['id']]['path'] = $aCat['id'];
}
}
unset($aCat);
return $aNested;
}
适用于我的解决方案:
这种重写方法解决了我的问题。对阵列进行了多次传球。
public function fnExpandTaxonomy(&$aData) {
$aTree = array();
// Loop original flat array, build associative and inject additional indices as required.
foreach($aData as $iKey => &$aCat){
$aTree[$aCat['id']] = &$aCat;
$aTree[$aCat['id']]['level'] = 0;
$aTree[$aCat['id']]['path'] = $aCat['id'];
$aTree[$aCat['id']]['sub'] = array();
}
// Loop - Add children to parents.
foreach($aTree as $iKey => &$aCat) {
if(!$aCat['parent_id']) continue;
unset($aCat['level'],$aCat['path'],$aCat['sub']);
$aCat['level'] = $aTree[$aCat['parent_id']]['level']+1;
$aCat['path'] = $aTree[$aCat['parent_id']]['path'].'_'.$aCat['id'];
$aTree[$aCat['parent_id']]['sub'][$aCat['id']] = &$aCat;
}
// Loop again, remove any items that don't have a parent of 0;
foreach($aTree as $iKey => &$aCat) {
if(!$aCat['parent_id']) continue;
unset($aTree[$iKey]);
}
unset($aCat);
return $aTree;
}
非常感谢pyson,他的回答(下面)在另一个类似的帖子中帮助了我。
从数组列表创建数组树