2010-12-07 68 views
3

下面是在mysql表中的数据集:PHP创建从一个平面数据集多维对象(从MySQL表)

使用MySQL的嵌套集合模型,不是很明显,因为我已经离开了lftrgt列。

+------+----------+--------------------------------+-------+ 
+ 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 | 
+------+----------+--------------------------------+-------+ 

这被拉入一个2维数组:

<?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) 
     ); 
?> 

我想实现以下多维对象:

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 
        } 
       } 
      } 
     } 
    } 
} 

我一直在玩一个递归函数几乎没有运气。

为什么? - 该对象将用于创建Zend_Navigation。我不想在这个阶段使用XML文件,我更喜欢在数据库中完成分类管理。

任何想法?

回答

4

这不一定是递归的工作,这可以通过迭代轻松完成。

<?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); 

?> 

结果:

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

标识数据是从数据库中抽取与mysql_fetch_object对象,会变成怎样的代码? – 2010-12-07 21:03:11

相关问题