Bonsoir !
Voilà j'ai un petit problème d'algorithmie et de récursivité et je ne sais pas trop comment m'en sortir..
Je veux dessiner ce graphe : http://bl.ocks.org/mbostock/raw/4063550/ et le json correspondant est celui ci : http://bl.ocks.org/mbostock/raw/4063550/flare.json
Seul "name" et "children" m'intéressent, pas "size".
Je reçois de ma base de données un nom et la profondeur associé dans l'arbre, le tout est ordonnée correctement :
Voilà un exemple de donnée que je reçois, traduit en un tableau PHP :
j'ai bougé volontairement la valeur de "name", pour qu'on voit bien l'arbre se dessiner.
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 $subtree = [ ['name' => 'ELECTRONICS', 'depth' => 0], ['name' => 'TELEVISIONS', 'depth' => 1], ['name' => 'TUBE', 'depth' => 2], ['name' => 'LCD', 'depth' => 2], ['name' => 'PLASMA', 'depth' => 2], ['name' => 'PORTABLE ELECTRONICS', 'depth' => 1], ['name' => 'MP3 PLAYERS', 'depth' => 2], ['name' => 'FLASH', 'depth' => 3], ['name' => 'CD PLAYERS', 'depth' => 2], ['name' => '2 WAY RADIOS', 'depth' => 2] ];
J'avais donc commencé un bout de code comme ça, mais ça ne fonctionne pas comme je veux bien sur...
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 function buildTree($data) { $tree = []; $current = 0; foreach ($data as $key => $child) { // Root if ($key == $current) { $tree['name'] = $child['name']; $lastLevel = $child['depth']; $lastKey = $key; // Child } elseif(($lastKey + 1) == $key && $child['depth'] == ($lastLevel + 1)) { //echo $key." -> " . $child['name'].": ".$child['depth']." == ".($lastLevel + 1)."\n"; if (!isset($tree['children'])) { $tree['children'] = []; } $tree['children'][] = buildTree(array_slice($data, $key)); $current++; } } return $tree; } $tree = buildTree($subtree); print_r($tree); //json_encode après..
Ce n'est sûrement pas un bon début de solution, alors s'il quelqu'un est fort en algo, un petit coup de pouce ne serait pas de refus..
Merci !
Partager