Creando matriz padre-hijo PHP
Tengo esta matriz plana que estoy tratando de convertir en una matriz padre-hijo:
Array
(
[0] => Array
(
[parent_id] => t3_42yrg7
[id] => t1_cze7b2e
)
[1] => Array
(
[parent_id] => t3_42yrg7
[id] => t1_czeg8ay
)
[2] => Array
(
[parent_id] => t1_czeg8ay
[id] => t1_czet481
)
[3] => Array
(
[parent_id] => t3_42yrg7
[id] => t1_cze4whs
)
[4] => Array
(
[parent_id] => t1_cze4whs
[id] => t1_cze9v0o
)
[5] => Array
(
[parent_id] => t1_cze9v0o
[id] => t1_czec4vd
)
[6] => Array
(
[parent_id] => t1_czec4vd
[id] => t1_czep9e2
)
[7] => Array
(
[parent_id] => t1_czep9e2
[id] => t1_czf2k8e
)
[8] => Array
(
[parent_id] => t1_czec4vd
[id] => t1_czeixa7
)
[9] => Array
(
[parent_id] => t1_cze9v0o
[id] => t1_czecx26
)
[10] => Array
(
[parent_id] => t1_czecx26
[id] => t1_czeenuz
)
[11] => Array
(
[parent_id] => t1_czeenuz
[id] => t1_czeftkf
)
[12] => Array
(
[parent_id] => t1_czecx26
[id] => t1_czehjrz
)
[13] => Array
(
[parent_id] => t1_czecx26
[id] => t1_czeien4
)
[14] => Array
(
[parent_id] => t1_cze9v0o
[id] => t1_czebugl
)
[15] => Array
(
[parent_id] => t1_cze4whs
[id] => t1_cze9hvb
)
[16] => Array
(
[parent_id] => t3_42yrg7
[id] => t1_cze3vku
)
[17] => Array
(
[parent_id] => t1_cze3vku
[id] => t1_czemk0g
)
[18] => Array
(
[parent_id] => t3_42yrg7
[id] => t1_czeedh9
)
[19] => Array
(
[parent_id] => t3_42yrg7
[id] => t1_czeenjx
)
[20] => Array
(
[parent_id] => t3_42yrg7
[id] => t1_cze5r5u
)
[21] => Array
(
[parent_id] => t1_cze5r5u
[id] => t1_czefle4
)
[22] => Array
(
[parent_id] => t3_42yrg7
[id] => t1_cze8oht
)
[23] => Array
(
[parent_id] => t1_cze8oht
[id] => t1_czelwvs
)
[24] => Array
(
[parent_id] => t3_42yrg7
[id] => t1_cze5cs6
)
[25] => Array
(
[parent_id] => t1_cze5cs6
[id] => t1_czefydi
)
[26] => Array
(
[parent_id] => t1_cze5cs6
[id] => t1_czedpml
)
[27] => Array
(
[parent_id] => t3_42yrg7
[id] => t1_cze42aq
)
[28] => Array
(
[parent_id] => t1_cze42aq
[id] => t1_cze8iei
)
[29] => Array
(
[parent_id] => t1_cze8iei
[id] => t1_czebkgk
)
[30] => Array
(
[parent_id] => t1_czebkgk
[id] => t1_czedid2
)
[31] => Array
(
[parent_id] => t1_cze8iei
[id] => t1_czebqgn
)
[32] => Array
(
[parent_id] => t1_cze42aq
[id] => t1_cze77xr
)
[33] => Array
(
[parent_id] => t3_42yrg7
[id] => t1_czen20j
)
)
Aquí está mi función recursiva que asigna los identificadores y los convierte en una matriz padre-hijo:
function buildTree(array $elements, $parentId = 0) {
$branch = array();
foreach ($elements as $element) {
if ($element['parent_id'] == $parentId) {
$children = buildTree($elements, $element['id']);
if ($children) {
$element['children'] = $children;
}
$branch[] = $element;
}
}
return $branch;
}
Aquí está la salida que obtengo de la función anterior:
Array
(
[0] => Array
(
[parent_id] => t3_42yrg7
[id] => t1_cze7b2e
)
[1] => Array
(
[parent_id] => t3_42yrg7
[id] => t1_czeg8ay
[children] => Array
(
[0] => Array
(
[parent_id] => t1_czeg8ay
[id] => t1_czet481
)
)
)
[2] => Array
(
[parent_id] => t1_czeg8ay
[id] => t1_czet481
)
[3] => Array
(
[parent_id] => t3_42yrg7
[id] => t1_cze4whs
[children] => Array
(
[0] => Array
(
[parent_id] => t1_cze4whs
[id] => t1_cze9v0o
[children] => Array
(
[0] => Array
(
[parent_id] => t1_cze9v0o
[id] => t1_czec4vd
[children] => Array
(
[0] => Array
(
[parent_id] => t1_czec4vd
[id] => t1_czep9e2
[children] => Array
(
[0] => Array
(
[parent_id] => t1_czep9e2
[id] => t1_czf2k8e
)
)
)
[1] => Array
(
[parent_id] => t1_czec4vd
[id] => t1_czeixa7
)
)
)
[1] => Array
(
[parent_id] => t1_cze9v0o
[id] => t1_czecx26
[children] => Array
(
[0] => Array
(
[parent_id] => t1_czecx26
[id] => t1_czeenuz
[children] => Array
(
[0] => Array
(
[parent_id] => t1_czeenuz
[id] => t1_czeftkf
)
)
)
[1] => Array
(
[parent_id] => t1_czecx26
[id] => t1_czehjrz
)
[2] => Array
(
[parent_id] => t1_czecx26
[id] => t1_czeien4
)
)
)
[2] => Array
(
[parent_id] => t1_cze9v0o
[id] => t1_czebugl
)
)
)
[1] => Array
(
[parent_id] => t1_cze4whs
[id] => t1_cze9hvb
)
)
)
[4] => Array
(
[parent_id] => t1_cze4whs
[id] => t1_cze9v0o
[children] => Array
(
[0] => Array
(
[parent_id] => t1_cze9v0o
[id] => t1_czec4vd
[children] => Array
(
[0] => Array
(
[parent_id] => t1_czec4vd
[id] => t1_czep9e2
[children] => Array
(
[0] => Array
(
[parent_id] => t1_czep9e2
[id] => t1_czf2k8e
)
)
)
[1] => Array
(
[parent_id] => t1_czec4vd
[id] => t1_czeixa7
)
)
)
[1] => Array
(
[parent_id] => t1_cze9v0o
[id] => t1_czecx26
[children] => Array
(
[0] => Array
(
[parent_id] => t1_czecx26
[id] => t1_czeenuz
[children] => Array
(
[0] => Array
(
[parent_id] => t1_czeenuz
[id] => t1_czeftkf
)
)
)
[1] => Array
(
[parent_id] => t1_czecx26
[id] => t1_czehjrz
)
[2] => Array
(
[parent_id] => t1_czecx26
[id] => t1_czeien4
)
)
)
[2] => Array
(
[parent_id] => t1_cze9v0o
[id] => t1_czebugl
)
)
)
[5] => Array
(
[parent_id] => t1_cze9v0o
[id] => t1_czec4vd
[children] => Array
(
[0] => Array
(
[parent_id] => t1_czec4vd
[id] => t1_czep9e2
[children] => Array
(
[0] => Array
(
[parent_id] => t1_czep9e2
[id] => t1_czf2k8e
)
)
)
[1] => Array
(
[parent_id] => t1_czec4vd
[id] => t1_czeixa7
)
)
)
[6] => Array
(
[parent_id] => t1_czec4vd
[id] => t1_czep9e2
[children] => Array
(
[0] => Array
(
[parent_id] => t1_czep9e2
[id] => t1_czf2k8e
)
)
)
[7] => Array
(
[parent_id] => t1_czep9e2
[id] => t1_czf2k8e
)
[8] => Array
(
[parent_id] => t1_czec4vd
[id] => t1_czeixa7
)
[9] => Array
(
[parent_id] => t1_cze9v0o
[id] => t1_czecx26
[children] => Array
(
[0] => Array
(
[parent_id] => t1_czecx26
[id] => t1_czeenuz
[children] => Array
(
[0] => Array
(
[parent_id] => t1_czeenuz
[id] => t1_czeftkf
)
)
)
[1] => Array
(
[parent_id] => t1_czecx26
[id] => t1_czehjrz
)
[2] => Array
(
[parent_id] => t1_czecx26
[id] => t1_czeien4
)
)
)
[10] => Array
(
[parent_id] => t1_czecx26
[id] => t1_czeenuz
[children] => Array
(
[0] => Array
(
[parent_id] => t1_czeenuz
[id] => t1_czeftkf
)
)
)
[11] => Array
(
[parent_id] => t1_czeenuz
[id] => t1_czeftkf
)
[12] => Array
(
[parent_id] => t1_czecx26
[id] => t1_czehjrz
)
[13] => Array
(
[parent_id] => t1_czecx26
[id] => t1_czeien4
)
[14] => Array
(
[parent_id] => t1_cze9v0o
[id] => t1_czebugl
)
[15] => Array
(
[parent_id] => t1_cze4whs
[id] => t1_cze9hvb
)
[16] => Array
(
[parent_id] => t3_42yrg7
[id] => t1_cze3vku
[children] => Array
(
[0] => Array
(
[parent_id] => t1_cze3vku
[id] => t1_czemk0g
)
)
)
[17] => Array
(
[parent_id] => t1_cze3vku
[id] => t1_czemk0g
)
[18] => Array
(
[parent_id] => t3_42yrg7
[id] => t1_czeedh9
)
[19] => Array
(
[parent_id] => t3_42yrg7
[id] => t1_czeenjx
)
[20] => Array
(
[parent_id] => t3_42yrg7
[id] => t1_cze5r5u
[children] => Array
(
[0] => Array
(
[parent_id] => t1_cze5r5u
[id] => t1_czefle4
)
)
)
[21] => Array
(
[parent_id] => t1_cze5r5u
[id] => t1_czefle4
)
[22] => Array
(
[parent_id] => t3_42yrg7
[id] => t1_cze8oht
[children] => Array
(
[0] => Array
(
[parent_id] => t1_cze8oht
[id] => t1_czelwvs
)
)
)
[23] => Array
(
[parent_id] => t1_cze8oht
[id] => t1_czelwvs
)
[24] => Array
(
[parent_id] => t3_42yrg7
[id] => t1_cze5cs6
[children] => Array
(
[0] => Array
(
[parent_id] => t1_cze5cs6
[id] => t1_czefydi
)
[1] => Array
(
[parent_id] => t1_cze5cs6
[id] => t1_czedpml
)
)
)
[25] => Array
(
[parent_id] => t1_cze5cs6
[id] => t1_czefydi
)
[26] => Array
(
[parent_id] => t1_cze5cs6
[id] => t1_czedpml
)
[27] => Array
(
[parent_id] => t3_42yrg7
[id] => t1_cze42aq
[children] => Array
(
[0] => Array
(
[parent_id] => t1_cze42aq
[id] => t1_cze8iei
[children] => Array
(
[0] => Array
(
[parent_id] => t1_cze8iei
[id] => t1_czebkgk
[children] => Array
(
[0] => Array
(
[parent_id] => t1_czebkgk
[id] => t1_czedid2
)
)
)
[1] => Array
(
[parent_id] => t1_cze8iei
[id] => t1_czebqgn
)
)
)
[1] => Array
(
[parent_id] => t1_cze42aq
[id] => t1_cze77xr
)
)
)
[28] => Array
(
[parent_id] => t1_cze42aq
[id] => t1_cze8iei
[children] => Array
(
[0] => Array
(
[parent_id] => t1_cze8iei
[id] => t1_czebkgk
[children] => Array
(
[0] => Array
(
[parent_id] => t1_czebkgk
[id] => t1_czedid2
)
)
)
[1] => Array
(
[parent_id] => t1_cze8iei
[id] => t1_czebqgn
)
)
)
[29] => Array
(
[parent_id] => t1_cze8iei
[id] => t1_czebkgk
[children] => Array
(
[0] => Array
(
[parent_id] => t1_czebkgk
[id] => t1_czedid2
)
)
)
[30] => Array
(
[parent_id] => t1_czebkgk
[id] => t1_czedid2
)
[31] => Array
(
[parent_id] => t1_cze8iei
[id] => t1_czebqgn
)
[32] => Array
(
[parent_id] => t1_cze42aq
[id] => t1_cze77xr
)
[33] => Array
(
[parent_id] => t3_42yrg7
[id] => t1_czen20j
)
)
Si bien la primera parte es correcta, a veces etiqueta las matrices secundarias como principales después de asignarlas correctamente la primera vez. ¿Por qué algunas matrices secundarias se asignan como padre?
Editar: Soy un idiota cuando llamobuildTree()
No estaba pasando un parentId y simplemente dejé el valor como cero.