Я написал функцию для преобразования одномерного массива (списка смежности) в многомерный массив. Я пытаюсь внедрить перечислимый путь в $ 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, чей ответ (ниже) в другой подобной теме помог мне.