Como crear un array árbol, con la siguiente función se crea solo, el array plano tiene que tener lo siguiente.
Array => (‘id_hijo’,’nombre_hijo’,’id_padre’) tiene que ser indexado por numero 0,1,2 etc… (FETCH::NUM)
Ej.:
Array
(
[0] => id_hijo
[1] => nombre
[2] => id_padre
[3] => etc…
)
La función:
function buildTree(array &$elements, $parentId = 0,$level = 0) {
$branch = array();
foreach ($elements as &$element) {
if ($element[2] == $parentId) {
$children = $this->buildTree($elements, $element[0],$level+1);
if ($children) {
$element['children'] = $children;
}
$element['level'] = $level;
$branch[$element[0]] = $element;
unset($element);
}
}
return $branch;
}
$tree = buildTree($array);
Luego podemos hacer lo que queramos con el árbol, por ejemplo crear un select option.
function optionSelect($value,$seleccionado,$texto){
$selected = $value == $seleccionado ? "selected" : "";
$option = "<option title='$texto' value='$value' $selected>$texto</option>";
return $option;
}
function walkTreeSelectOption($elements,$seleccionado = ''){
$return = '';
foreach($elements as &$value){
if($value['level'] == 0)
$return .= '<optgroup label="'.$value[1].'">';
$texto = str_repeat("- ", $value['level']).$value[1];
$return .= $this->optionSelect($value[0],$seleccionado,$texto);
if (isset($value['children'])):
$return .= $this->walkTreeSelectOption($value['children'],$seleccionado);
endif;
if($value['level'] == 0)
$return .= '</optgroup>';
}
return $return;
}
$options = walkTreeSelectOption($tree,'id_hijo') // podemos pasarle el id_hijo para que se seleccione en el select
Aquí si queréis pasar el build tree de nuevo a array pero ordenado link