Construa uma árvore a partir de uma matriz plana em PHP
Procurei na internet e ainda não encontrei o que estava procurando. Eu tenho uma matriz plana com cada elemento que contém um 'id' e um 'parent_id'. Cada elemento terá apenas UM pai, mas pode ter vários filhos. Se parent_id = 0, é considerado um item de nível raiz. Estou tentando colocar minha matriz plana em uma árvore. Os outros exemplos que encontrei apenas copiam o elemento para o pai, mas o original ainda exist
EDITA
ada elemento da matriz inicial é lido a partir de um arquivo XML separado. O arquivo em si terá '0' como o valor para parent_id se ele não tiver um pai. As chaves são realmente cadeias de caracteres.
Sinto muito pela confusão anterior. Espero que isso seja mais claro:
/EDITA
Minha matriz inicial:
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_ ) )
A matriz resultante após a criação da árvore:
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_ ) ) )
Qualquer ajuda / orientação é muito apreciada!
Alguns códigos que tenho até agora:
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; }