Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: luispdl en 13 de Diciembre 2016, 04:02
-
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
[{"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.
[{"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
-
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:
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.
$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:
$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
-
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