Вставьте перечисленный путь в foreach & gt; одно-многомерный массив

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

1

Решение

Измените код вашей функции следующим образом:

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;
}
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, чей ответ (ниже) в другой подобной теме помог мне.

создать дерево массивов из списка массивов

0