2010-12-07 25 views
3

est ici le jeu de données dans la table mysql:PHP Création d'un objet multidimensionnel à partir d'un jeu de données plat (à partir Mysql Table)

En utilisant le modèle Set MySQL Nested, il est pas évident, parce que je l'ai quitté le lft et rgt colonnes.

+------+----------+--------------------------------+-------+ 
+ Id | ParentId | Name       | Level | 
+------+----------+--------------------------------+-------+ 
| 1001 |  NULL | Computing      |  0 | 
| 1002 |  NULL | Cassettes & Vinyl    |  0 | 
| 1003 |  1001 | CD Players      |  1 | 
| 1004 |  1002 | CD Writers      |  1 | 
| 1005 |  1003 | CD-ROM Drives     |  2 | 
| 1006 |  1004 | CDs       |  2 | 
+------+----------+--------------------------------+-------+ 

C'est tiré dans un tableau à 2 dimensions:

<?php 
$data = array(
      array('id' => 1001, 'ParentId' => NULL, 'Name' => 'Computing', 'Level' => 0), 
      array('id' => 1002, 'ParentId' => NULL, 'Name' => 'Cassettes & Vinyl', 'Level' => 0), 
      array('id' => 1003, 'ParentId' => 1001, 'Name' => 'CD Players', 'Level' => 1), 
      array('id' => 1004, 'ParentId' => 1002, 'Name' => 'CD Writers', 'Level' => 1), 
      array('id' => 1005, 'ParentId' => 1003, 'Name' => 'CD-ROM Drives', 'Level' => 2), 
      array('id' => 1006, 'ParentId' => 1004, 'Name' => 'Computing', 'Level' => 3) 
     ); 
?> 

Je suis en train de réaliser l'objet multidimensionnel suivant:

stdClass Object { 
    [0] => stdClass Object { 
     [id] => 1001 
     [name] => Computing 
     [parentId] => NULL 
     [level] => 0 
     [children] => stdClass Object { 
      [0] => stdClass Object { 
       [id] => 1003 
       [name] => CD Players 
       [parentId] => 1001 
       [level] => 1 
       [children] => stdClass Object { 
        [0] => stdClass Object { 
         [id] => 1005 
         [name] => CD Rom Drives 
         [parentId] => 1003 
         [level] => 2 
        } 
       } 
      } 
     } 
    } 
    [1] => stdClass Object { 
     [id] => 1002 
     [name] => Cassettes & Vinyl 
     [parentId] => NULL 
     [level] => 0 
     [children] => stdClass Object { 
      [0] => stdClass Object { 
       [id] => 1004 
       [name] => CD Writers 
       [parentId] => 1002 
       [level] => 1 
       [children] => stdClass Object { 
        [0] => stdClass Object { 
         [id] => 1006 
         [name] => CDs 
         [parentId] => 1004 
         [level] => 2 
        } 
       } 
      } 
     } 
    } 
} 

Je joue avec une fonction récursive avec peu de chance.

Pourquoi? - Cet objet sera utilisé pour créer Zend_Navigation. Je ne veux pas utiliser de fichier XML à ce stade, je préfère la gestion de la taxonomie à faire dans la base de données.

Des idées?

Répondre

4

Ce n'est pas nécessairement un travail de récursivité, cela peut être fait facilement par itération.

<?php 

$data = array(
    array('id' => 1001, 'ParentId' => NULL, 'Name' => 'Computing', 'Level' => 0), 
    array('id' => 1002, 'ParentId' => NULL, 'Name' => 'Cassettes & Vinyl', 'Level' => 0), 
    array('id' => 1003, 'ParentId' => 1001, 'Name' => 'CD Players', 'Level' => 1), 
    array('id' => 1004, 'ParentId' => 1002, 'Name' => 'CD Writers', 'Level' => 1), 
    array('id' => 1005, 'ParentId' => 1003, 'Name' => 'CD-ROM Drives', 'Level' => 2), 
    array('id' => 1006, 'ParentId' => 1004, 'Name' => 'Computing', 'Level' => 3) 
); 

$index = array(); 
$tree = array(); 

// step 1: build index (note that I use &$row references!) 
foreach ($data as &$row) { 
    $index[$row['id']] = &$row; 
    $row['children'] = array(); 
    if ($row['ParentId'] == NULL) { 
    $tree[] = &$row; 
    } 
} 

// step 2: link tree (references here as well!) 
foreach ($data as &$row) { 
    $index[$row['ParentId']]['children'][] = &$row; 
} 

print_r($tree); 

?> 

Résultat:

Array 
(
    [0] => Array 
    (
    [id] => 1001 
    [ParentId] => 
    [Name] => Computing 
    [Level] => 0 
    [children] => Array 
    (
     [0] => Array 
     (
     [id] => 1003 
     [ParentId] => 1001 
     [Name] => CD Players 
     [Level] => 1 
     [children] => Array 
     (
      [0] => Array 
      (
      [id] => 1005 
      [ParentId] => 1003 
      [Name] => CD-ROM Drives 
      [Level] => 2 
      [children] => Array 
      (
      ) 
     ) 
     ) 
    ) 
    ) 
) 
    [1] => Array 
    (
    [id] => 1002 
    [ParentId] => 
    [Name] => Cassettes & Vinyl 
    [Level] => 0 
    [children] => Array 
    (
     [0] => Array 
     (
     [id] => 1004 
     [ParentId] => 1002 
     [Name] => CD Writers 
     [Level] => 1 
     [children] => Array 
     (
      [0] => Array 
      (
      [id] => 1006 
      [ParentId] => 1004 
      [Name] => Computing 
      [Level] => 3 
      [children] => Array 
      (
      ) 
     ) 
     ) 
    ) 
    ) 
) 
) 
+0

Id les données ont été tiré de la base de données comme un objet avec mysql_fetch_object, qu'est-ce que le code deviendra? –

+0

Qu'en est-il de l'utilisation de 'mysql_fetch_assoc()'? Ce serait moins de tracas. A part ça, le code ci-dessus est assez trivial. Il ne devrait pas être difficile pour vous de faire les changements nécessaires. – Tomalak