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