Build Tree Array PHP

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

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Captcha cargando...