Estoy tratando de llenar json de datos para treemaker.js a partir de datos de la base de datos; el conjunto de resultados se ve así:
[ ['id' => 1, 'root' => 1, 'parent_id' => 0], ['id' => 2, 'root' => 1, 'parent_id' => 1], ['id' => 3, 'root' => 1, 'parent_id' => 2], ['id' => 4, 'root' => 1, 'parent_id' => 2], ['id' => 5, 'root' => 1, 'parent_id' => 3], ['id' => 6, 'root' => 1, 'parent_id' => 3], ['id' => 7, 'root' => 1, 'parent_id' => 4], ['id' => 8, 'root' => 1, 'parent_id' => 4], ['id' => 9, 'root' => 1, 'parent_id' => 4], ]Esperaba que la salida json fuera así:
{ '1': { '2': { '3': { '5': '', '6': '', }, '4': { '7': '', '8': '', '9': '', }, }, }, }Ya probé:
function buildTree(array $elements, $parentId = 0) { $branch = []; $new = []; foreach ($elements as $element) { if ($element['parent_id'] == $parentId) { $children = $this->buildTree($elements, $element['id']); if ($children) { $element[$element['id']] = $children; } else { $element[$element['id']] = ''; } unset($element["id"]); unset($element["root"]); unset($element["parent_id"]); $branch[] = $element; } } return $branch; } public function test($id) { $data = $this->Data_model->getDataByRoot($id)->result_array(); $tree = $this->buildTree($data); echo "<pre>"; print_r( json_encode($tree, JSON_PRETTY_PRINT|JSON_FORCE_OBJECT)); }Obtuve la referencia de la matriz jerárquica de PHP - Padres e hijos , pero el resultado es así .
Aquí está mi solución:
function buildTree(array &$elements, $parentId = 0) { $branch = []; foreach ($elements as $element) { if ($element['parent_id'] == $parentId) { $id = $element['id']; $children = buildTree($elements, $id); if ($children) { $branch[$id] = $children; } else { $branch[$id] = ''; } } } return $branch; }Mientras itera y repite cuando se encuentra un parent_id coincidente, inserte los datos secundarios en un elemento que está clave por el id de la fila actual. Si no hay niños para la fila, recurra a una cadena vacía con el operador ternario abreviado (también conocido como "operador de Elvis").
Código: ( Demostración )
function buildTree(array $rows, int $parentId = 0): array { $new = []; foreach ($rows as $row) { if ($row['parent_id'] == $parentId) { $new[$row['id']] = buildTree($rows, $row['id']) ?: ''; } } return $new; } $resultSet = [ ['id' => 1, 'parent_id' => 0], ['id' => 2, 'parent_id' => 1], ['id' => 3, 'parent_id' => 2], ['id' => 4, 'parent_id' => 2], ['id' => 5, 'parent_id' => 3], ['id' => 6, 'parent_id' => 3], ['id' => 7, 'parent_id' => 4], ['id' => 8, 'parent_id' => 4], ['id' => 9, 'parent_id' => 4], ]; var_export( buildTree($resultSet) );Mi consejo se parece en gran medida al consejo que se da aquí .