我有这个方法,它将采用单维数组并将其转换为多维数组。它是一个类别的邻接列表。我随时都会注入一个枚举路径。它有90%的时间有效。
public 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;
}
这种方法在90%的情况下正常工作,但是"路径"正在注入的索引有时会在之后注入" sub"索引并导致枚举路径计算不正确。示例:
正确:
[18] => Array
(
[id] => 18
[parent_id] => 1
[title] => Category 1
[path] => 1_18
[sub] => Array
(
[150] => Array
(
[id] => 150
[parent_id] => 18
[title] => Category 2
[path] => 1_18_150
但是在一些迭代中,它会注入“路径”。在' sub'之后而且例程将失败。
失败:
[45] => Array
(
[id] => 45
[parent_id] => 2
[sub] => Array
(
[10] => Array
(
[id] => 10
[parent_id] => 45
[sub] => Array
(
[152] => Array
(
[id] => 152
[parent_id] => 10
[title] => Category 1
[path] => _152
)
[79] => Array
(
[id] => 79
[parent_id] => 10
[title] => Category 2
[path] => _10_79
)
)
[title] => Dryers
[path] => _10
注意子注入后如何注入路径和标题。知道为什么吗?
答案 0 :(得分:0)
此方法重写解决了我的问题。在阵列上多次传球。
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,他在另一个类似线程中的答案(下图)帮助了我。