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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| <?php
$categs = array(array('cat_id' => 0, 'nom' => 'PHP'),
array('cat_id' => 1, 'nom' => 'JAVA'),
array('cat_id' => 2, 'nom' => 'VBA'));
$forums = array(array('forum_id' => 1, 'cat_id' => 0, 'nom' => 'Général'),
array('forum_id' => 2, 'parent_forum_id' => 1, 'nom' => 'Code'),
array('forum_id' => 3, 'parent_forum_id' => 1, 'nom' => 'Syntaxe'),
array('forum_id' => 4, 'parent_forum_id' => 1, 'nom' => 'Langage'),
array('forum_id' => 5, 'parent_forum_id' => 4, 'nom' => 'Débutant'),
array('forum_id' => 6, 'parent_forum_id' => 4, 'nom' => 'Confirmé'),
array('forum_id' => 7, 'cat_id' => 2, 'nom' => 'Général'),
array('forum_id' => 8, 'parent_forum_id' => 7, 'nom' => 'Code'),
array('forum_id' => 9, 'parent_forum_id' => 7, 'nom' => 'Syntaxe'),
array('forum_id' => 10, 'parent_forum_id' => 7, 'nom' => 'Langage'),
array('forum_id' => 11, 'parent_forum_id' => 10, 'nom' => 'Débutant'),
array('forum_id' => 12, 'parent_forum_id' => 10, 'nom' => 'Confirmé'),
array('forum_id' => 13, 'cat_id' => 1, 'nom' => 'Général'),
array('forum_id' => 14, 'parent_forum_id' => 13, 'nom' => 'Code'),
array('forum_id' => 15, 'parent_forum_id' => 13, 'nom' => 'Syntaxe'),
array('forum_id' => 16, 'parent_forum_id' => 13, 'nom' => 'Langage'),
array('forum_id' => 17, 'parent_forum_id' => 16, 'nom' => 'Débutant'),
array('forum_id' => 18, 'parent_forum_id' => 16, 'nom' => 'Confirmé'));
$map = array();
$paths = array();
# récupération de toutes les catégories il fallait éviter
# les collisions entre les clés des cat_id et des fourm_id
# donc j'ai préfixé les cat_id avec un 'g'
foreach($categs as $cat) {
$map['g' . $cat['cat_id']] = array('type' => 'categ',
'details' => $cat,
'subforums' => array());
}
# arborescence des forums
foreach($forums as $forum) {
$idParent = $forum['parent_forum_id'];
$idForum = $forum['forum_id'];
$current = array($idForum => array('type' => 'forum',
'details' => $forum,
'subforums' => array()));
if (is_null($idParent)) {
# forum racine
$map['g' . $forum['cat_id']]['subforums'] += $current;
$paths[$idForum] = array('g' . $forum['cat_id']);
} else {
# sous-forum
# on sauvegarde le chemin vers le forum courant
$paths[$idForum] = array_merge($paths[$idParent], array($idParent));
$nb = count($paths[$idForum]);
for($i = 0; $i < $nb; $i++) {
if ($i == 0) {
$last =& $map[$paths[$idForum][$i]];
} else {
$last =& $last['subforums'][$paths[$idForum][$i]];
}
}
$last['subforums'] += $current;
}
}
var_dump($map);
?> |