Autor Tema: Algoritmo recursivo para creación de arbol JSON a partir de un archivo de datos  (Leído 5477 veces)

luispdl

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 10
    • Ver Perfil
Buenas, necesito que me ayuden con un algoritmo que no le puedo encontrar la vuelta. Tengo un json de categorias, donde tiene como atributos el id, el nombre y el padre.

Necesito armar otro json pero con los datos en forma de arbol. Pero la cuestion es que tendria q ser algo recursivo supongo, xq yo no se cuantos niveles de profundidad va a tener el arbol. Le muestro el json que tengo y pongo un ejemplo de lo q quisiera obtener.


El json que tengo


Código: [Seleccionar]
[{"id":1384417,"nombre":"HERRAMIENTAS EL\u00c9CTRICAS","padre":0},
{"id":1384418,"nombre":"Amoladoras","padre":1384417},
{"id":1384419,"nombre":"Aspiradoras\/Sopladores de Hojas","padre":1384417},
{"id":1384420,"nombre":"Atornilladores","padre":1384417},
{"id":1384423,"nombre":"Cepillos","padre":1384417},
{"id":1384424,"nombre":"Cortacercos","padre":1384417},
{"id":1384425,"nombre":"Electrosierras","padre":1384417},
{"id":1384444,"nombre":"Estaci\u00f3n de Inflado","padre":1384417},
{"id":1384445,"nombre":"Herramientas Estacionarias","padre":1384417},
{"id":1384446,"nombre":"Taladros de Banco","padre":1384445},
{"id":1384447,"nombre":"Sierras Ingleteadoras","padre":1384445},
{"id":1384448,"nombre":"Sierras de Banco","padre":1384445},
{"id":1384449,"nombre":"Lijadoras","padre":1384417},
{"id":1384450,"nombre":"De Banda","padre":1384449},
{"id":1384451,"nombre":"Orbitales","padre":1384449},
{"id":1384452,"nombre":"Llaves de Impacto","padre":1384417},
{"id":1384453,"nombre":"Martillos","padre":1384417},
{"id":1384454,"nombre":"Con Rotaci\u00f3n","padre":1384453},
{"id":1384455,"nombre":"Sin Rotaci\u00f3n","padre":1384453},
{"id":1384456,"nombre":"Pistolas de Calor","padre":1384417},
{"id":1384457,"nombre":"Pulidoras","padre":1384417},
{"id":1384458,"nombre":"Routers","padre":1384417},
{"id":1384459,"nombre":"Sierras","padre":1384417},
{"id":1384460,"nombre":"Taladros","padre":1384417},
{"id":1384461,"nombre":"Con Percusi\u00f3n","padre":1384460},
{"id":1384462,"nombre":"Sin percusi\u00f3n","padre":1384460},
{"id":1384464,"nombre":"Tornos Manuales","padre":1384417},
{"id":1508300,"nombre":"HERRAMIENTAS A BATER\u00cdA","padre":0},
{"id":1508315,"nombre":"Atornilladores","padre":1508300},
{"id":1384463,"nombre":"Taladros","padre":1508300},
{"id":1384426,"nombre":"HERRAMIENTAS A EXPLOSI\u00d3N","padre":0},
{"id":1384465,"nombre":"Desmalezadoras","padre":1384426},
{"id":1384466,"nombre":"Grupos Electr\u00f3genos","padre":1384426},
{"id":1384467,"nombre":"Motosierras","padre":1384426},
{"id":1384427,"nombre":"HIDROLAVADORAS EL\u00c9CTRICAS","padre":0},
{"id":1384471,"nombre":"NIVELES L\u00c1SER","padre":0},
{"id":1384472,"nombre":"LINTERNAS RECARGABLES","padre":0},
{"id":1384428,"nombre":"ACCESORIOS Y ELECTR\u00d3NICOS","padre":0},
{"id":1384468,"nombre":"Bater\u00edas","padre":1384428},
{"id":1384469,"nombre":"Cargadores de Bater\u00eda","padre":1384428},
{"id":1384470,"nombre":"Conservadoras","padre":1384428},
{"id":1384473,"nombre":"Para Compresores","padre":1384428}]


Y yo quisiera obtener algo asi.

Código: [Seleccionar]
[{"id":1384417,"nombre":"HERRAMIENTAS EL\u00c9CTRICAS","padre":0,
        "hijos":[{"id":1384418,"nombre":"Amoladoras","padre":1384417}
                     ,{"id":1384419,"nombre":"Aspiradoras","padre":1384417}
                     ,{"id":1384420,"nombre":"Atornilladores","padre":1384417}]}
,{"id":1384471,"nombre":"NIVELES L\u00c1SER","padre":0}]

El lenguaje en el cual me puedan ayudar me es indiferente, yo lo haria con javascript o php, pero da lo mismo.

Espero que se entienda y me puedan ayudar. Muchas Gracias
« Última modificación: 23 de Diciembre 2016, 21:05 por Ogramar »

GeekProgrammer

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 2
    • Ver Perfil
Re:Algoritmo para creación de arbol JSON
« Respuesta #1 en: 14 de Diciembre 2016, 16:31 »
Facil mira hay varios pasos:

1) preparar el arreglo para que los elementos tengan hijos, si lo haces con php primero hay que convertirlo usando json_decode(); nos da algo asi:

Código: [Seleccionar]
Array
(
    [0] => stdClass Object
        (
            [id] => 1384417
            [nombre] => HERRAMIENTAS ELÉCTRICAS
            [padre] => 0
        )

    [1] => stdClass Object
        (
            [id] => 1384418
            [nombre] => Amoladoras
            [padre] => 1384417
        )

    [2] => stdClass Object
        (
            [id] => 1384419
            [nombre] => Aspiradoras/Sopladores de Hojas
            [padre] => 1384417
        )

    [3] => stdClass Object
        (
            [id] => 1384420
            [nombre] => Atornilladores
            [padre] => 1384417
        )

    [4] => stdClass Object
        (
            [id] => 1384423
            [nombre] => Cepillos
            [padre] => 1384417
        )

    [5] => stdClass Object
        (
            [id] => 1384424
            [nombre] => Cortacercos
            [padre] => 1384417
        )

    [6] => stdClass Object
        (
            [id] => 1384425
            [nombre] => Electrosierras
            [padre] => 1384417
        )

    [7] => stdClass Object
        (
            [id] => 1384444
            [nombre] => Estación de Inflado
            [padre] => 1384417
        )

    [8] => stdClass Object
        (
            [id] => 1384445
            [nombre] => Herramientas Estacionarias
            [padre] => 1384417
        )

    [9] => stdClass Object
        (
            [id] => 1384446
            [nombre] => Taladros de Banco
            [padre] => 1384445
        )

    [10] => stdClass Object
        (
            [id] => 1384447
            [nombre] => Sierras Ingleteadoras
            [padre] => 1384445
        )

    [11] => stdClass Object
        (
            [id] => 1384448
            [nombre] => Sierras de Banco
            [padre] => 1384445
        )

    [12] => stdClass Object
        (
            [id] => 1384449
            [nombre] => Lijadoras
            [padre] => 1384417
        )

    [13] => stdClass Object
        (
            [id] => 1384450
            [nombre] => De Banda
            [padre] => 1384449
        )

    [14] => stdClass Object
        (
            [id] => 1384451
            [nombre] => Orbitales
            [padre] => 1384449
        )

    [15] => stdClass Object
        (
            [id] => 1384452
            [nombre] => Llaves de Impacto
            [padre] => 1384417
        )

    [16] => stdClass Object
        (
            [id] => 1384453
            [nombre] => Martillos
            [padre] => 1384417
        )

    [17] => stdClass Object
        (
            [id] => 1384454
            [nombre] => Con Rotación
            [padre] => 1384453
        )

    [18] => stdClass Object
        (
            [id] => 1384455
            [nombre] => Sin Rotación
            [padre] => 1384453
        )

    [19] => stdClass Object
        (
            [id] => 1384456
            [nombre] => Pistolas de Calor
            [padre] => 1384417
        )

    [20] => stdClass Object
        (
            [id] => 1384457
            [nombre] => Pulidoras
            [padre] => 1384417
        )

    [21] => stdClass Object
        (
            [id] => 1384458
            [nombre] => Routers
            [padre] => 1384417
        )

    [22] => stdClass Object
        (
            [id] => 1384459
            [nombre] => Sierras
            [padre] => 1384417
        )

    [23] => stdClass Object
        (
            [id] => 1384460
            [nombre] => Taladros
            [padre] => 1384417
        )

    [24] => stdClass Object
        (
            [id] => 1384461
            [nombre] => Con Percusión
            [padre] => 1384460
        )

    [25] => stdClass Object
        (
            [id] => 1384462
            [nombre] => Sin percusión
            [padre] => 1384460
        )

    [26] => stdClass Object
        (
            [id] => 1384464
            [nombre] => Tornos Manuales
            [padre] => 1384417
        )

    [27] => stdClass Object
        (
            [id] => 1508300
            [nombre] => HERRAMIENTAS A BATERÍA
            [padre] => 0
        )

    [28] => stdClass Object
        (
            [id] => 1508315
            [nombre] => Atornilladores
            [padre] => 1508300
        )

    [29] => stdClass Object
        (
            [id] => 1384463
            [nombre] => Taladros
            [padre] => 1508300
        )

    [30] => stdClass Object
        (
            [id] => 1384426
            [nombre] => HERRAMIENTAS A EXPLOSIÓN
            [padre] => 0
        )

    [31] => stdClass Object
        (
            [id] => 1384465
            [nombre] => Desmalezadoras
            [padre] => 1384426
        )

    [32] => stdClass Object
        (
            [id] => 1384466
            [nombre] => Grupos Electrógenos
            [padre] => 1384426
        )

    [33] => stdClass Object
        (
            [id] => 1384467
            [nombre] => Motosierras
            [padre] => 1384426
        )

    [34] => stdClass Object
        (
            [id] => 1384427
            [nombre] => HIDROLAVADORAS ELÉCTRICAS
            [padre] => 0
        )

    [35] => stdClass Object
        (
            [id] => 1384471
            [nombre] => NIVELES LÁSER
            [padre] => 0
        )

    [36] => stdClass Object
        (
            [id] => 1384472
            [nombre] => LINTERNAS RECARGABLES
            [padre] => 0
        )

    [37] => stdClass Object
        (
            [id] => 1384428
            [nombre] => ACCESORIOS Y ELECTRÓNICOS
            [padre] => 0
        )

    [38] => stdClass Object
        (
            [id] => 1384468
            [nombre] => Baterías
            [padre] => 1384428
        )

    [39] => stdClass Object
        (
            [id] => 1384469
            [nombre] => Cargadores de Batería
            [padre] => 1384428
        )

    [40] => stdClass Object
        (
            [id] => 1384470
            [nombre] => Conservadoras
            [padre] => 1384428
        )

    [41] => stdClass Object
        (
            [id] => 1384473
            [nombre] => Para Compresores
            [padre] => 1384428
        )

)

Luego hay que preparar los elementos agregándoles un "hijo" que es un array.

Código: [Seleccionar]
$tmp = json_decode($a);
foreach($tmp as $b) {
$b->hijos = array();
}

Luego recorres otravez todo el array de herramientas, si padre es 0 continuamos, si padre no es 0, buscamos su padre lo metemos en hijos y lo borramos del arreglo original

Mas o menos asi:

Código: [Seleccionar]
$tmp = json_decode($a);


foreach($tmp as $c) {
$retval = insertarEnPadre($tmp, $c->padre, $c);
if($retval == 0) {
unset($c);
}
}


function insertarEnPadre($herramientas, $id, $hijo){
foreach($herramientas as $herramienta) {
if($herramienta->padre == 0) {
continue;
} else {
if($id == $herramienta->padre) {
if(!isset($herramienta->hijos)) {
$herramienta->hijos = array();
}
array_push($herramienta->hijos, $hijo);
return 0;
}
}
}
return 1;
}

print_r($tmp);

Talvez no funcione... necesito cafe xD

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Re:Algoritmo para creación de arbol JSON
« Respuesta #2 en: 23 de Diciembre 2016, 21:04 »
Buenas luispdl ¿llegaste a probar el código que propuso GeekProgrammer? Si es así sería interesante saber si lograste resolverlo y con qué código finalmente

Salu2

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".