es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Crear estructuras de árbol a partir de matrices en PHP

Tengo una matriz como esta:

array(
    array(id => 7, parent_id => 0, name => Activos Corrientes)
    array(id => 8, parent_id => 0, name => Activos Fijos)
    array(id => 18, parent_id => 7, name => Activos)
    array(id => 38, parent_id => 18, name => Cuentas por Cobrar)
    array(id => 38, parent_id => 18, name => Inventario)
    array(id => 39, parent_id => 0, name => Costo de Inventario de Tierra)
    array(id => 40, parent_id => 38, name => Jazz Cash)
    array(id => 41, parent_id => 39, name => Anticipo a Proveedores)
)

Ahora necesito una forma eficiente de convertir esto en una estructura de árbol como esta.

array(
    array(id => 7, parent_id => 0, name => Activos Corrientes, nivel=>0)
    array(id => 8, parent_id => 0, name => Activos Fijos, nivel => )
    array(id => 18, parent_id => 7, name => Activos, nivel => 1)
    array(id => 38, parent_id => 18, name => Inventario, nivel => 2)
    array(id => 39, parent_id => 0, name => Costo de Inventario de Tierra, nivel => 0)
    array(id => 40, parent_id => 38, name => Jazz Cash, nivel => 3)
    array(id => 41, parent_id => 39, name => Anticipo a Proveedores, nivel => 1)
)

No necesito agregarlos a la izquierda o a la derecha, solo necesito los niveles simples que pasaré a jQgrid.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para convertir el arreglo dado en una estructura de árbol, podemos utilizar una función recursiva que tome el arreglo original y el ID del padre (inicialmente establecido en 0 para el padre principal). La función iterará a través del arreglo y para cada elemento, si su ID padre coincide con el ID de padre actual, entonces agregará el elemento como hijo de su padre y llamará a la función recursivamente con el nuevo ID de padre como el ID actual del elemento.

    Para realizar un seguimiento del nivel de cada elemento, podemos agregar una clave de “nivel” a cada elemento e incrementarla en uno cada vez que se llama la función recursiva.

    Aquí está el código de la función recursiva:

    function makeTree($array, $parent_id = 0, $level = 0) {
        $tree = array();
    
        foreach ($array as $element) {
            if ($element['parent_id'] == $parent_id) {
                $element['level'] = $level;
                $element['children'] = makeTree($array, $element['id'], $level+1);
                $tree[] = $element;
            }
        }
    
        return $tree;
    }
    

    Luego podemos llamar a esta función con el arreglo dado para obtener la estructura de árbol deseada:

    $array = array(
        array('id' => 7, 'parent_id' => 0, 'name' => 'Current Assets'),
        array('id' => 8, 'parent_id' => 0, 'name' => 'Fixed Assets'),
        array('id' => 18, 'parent_id' => 7, 'name' => 'Assets'),
        array('id' => 38, 'parent_id' => 18, 'name' => 'Receivable'),
        array('id' => 38, 'parent_id' => 18, 'name' => 'Inventory'),
        array('id' => 39, 'parent_id' => 0, 'name' => 'Landed Cost Of Inventory'),
        array('id' => 40, 'parent_id' => 38, 'name' => 'Jazz Cash'),
        array('id' => 41, 'parent_id' => 39, 'name' => 'Advance to Vendors')
    );
    
    $tree = makeTree($array);
    

    La variable resultante $tree contendrá la estructura de árbol deseada. Luego podemos pasar esto a jQgrid junto con los demás datos necesarios.

Comments are closed.