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 !