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.

¿Cómo iterar a través de todos los hijos en la base de datos?

en la base de datos: (estos son basicamente carpetas)

|groupId|  name   |parentId|
  1       system1     0
  2       subsystem1  1
  3       subsystem2  2
  4       subsubMisc  2

lo cual debería dar

system1
  -subsystem1
    --subsystem2
    --subsubMisc

Hasta ahora solo el primer hijo se popula, no obtengo hijos de subsystem1. Necesito esto a continuación con todos los hijos en adelante si tienen alguno:

[
    {
        "name": "system1",
        "children": [
            {
                "name": "subsystem1",
                "children": [
                    {
                        "name": "subsystem2",
                    },
                    {
                        "name": "subsubMisc",
                    }
                ]
            }
        ]
    }
]

Mi código:

public function getTreeMenu()
{
    $result = false;
    $data = $this->repository->getRootParents(); // SELECT * FROM myTable WHERE parentId = 0 

    foreach ($data as $row) {
        $children = $this->repository->getFolderChildren($row['parentId']); // SELECT * FROM myTable WHERE pid = :parentId ORDER BY name
        if ($children !== false) {
            $result[] = array(
                'name' => $row['name'],
                'children' => $children,
            );
        } else {
            $result[] = array(
                'name' => $row['name'],
            );
        }
    }
    return $result;
}

Esto solo funciona para el primer nivel. ¿Cómo hago un bucle continuo de las subcarpetas para las carpetas dadas?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para recorrer de forma continua las subcarpetas de las carpetas dadas, puedes modificar el código para utilizar una función recursiva que se llame a sí misma para cada carpeta hija. Aquí tienes un ejemplo:

    public function getTreeMenu($parentId = 0)
    {
        $result = array();
        $data = $this->repository->getFolderChildren($parentId); // SELECT * FROM myTable WHERE parentId = :parentId ORDER BY name
    
        foreach ($data as $row) {
            $children = $this->getTreeMenu($row['groupId']);
            if (!empty($children)) {
                $result[] = array(
                    'name' => $row['name'],
                    'children' => $children,
                );
            } else {
                $result[] = array(
                    'name' => $row['name'],
                );
            }
        }
    
        return $result;
    }
    

    Este código comenzará con las carpetas raíz (aquellas con un parentId de 0) y llamará recursivamente a sí misma para cada carpeta hija. El resultado será un array anidado que representa la estructura de carpetas. Puedes utilizar este array para crear la salida JSON que necesitas.

Comments are closed.