从DB创建多维数组

时间:2010-02-19 08:06:35

标签: php mysql database multidimensional-array

我真的希望有人可以帮助我。我现在挣扎了近两天......

我有一个DB表“Device”和一个表“Connection”。我用它来形象化我公司的网络。为了将数据传递给JS框架,我用来可视化我需要这样的数组的数据:

Array
(
    [id] => 1
    [name] => TestPC1
    [children] => Array
        (
            [0] => Array
                (
                    [id] => 2
                    [name] => Testhub 2
                    [data] => Array
                        (
                        )

                    [children] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 3
                                    [name] => Rack3
                                    [data] => Array
                                        (
                                        )

                                    [children] => Array
                                        (
                                        )

                                )

                            [1] => Array
                                (
                                    [id] => 4
                                    [name] => Rack4
                                    [data] => Array
                                        (
                                        )

                                    [children] => Array
                                        (
                                        )

                                )

                        )

                )

        )

)

设备表如下所示:

A     |     B
-------------------
1     |     2
2     |     3
2     |     4

此示例的可视化如下所示:

http://img34.imageshack.us/img34/4230/netmd.jpg

有没有人有想法,如何从db-data到这个数组?

谢谢。

2 个答案:

答案 0 :(得分:0)

我建议您浏览(一般来说这个网站和互联网)“如何在RDBMS中表示树”。

可能会开始here

根据您必须管理的“树木”数量以及层次结构的最大深度,不同的方法可能或多或少可行。

答案 1 :(得分:0)

假设您希望使用该表在PHP中执行此操作,例如,我将使用数组来表示在给定表与我想象的ID之后的JOIN之后返回的数据库数据>名称映射表:

$links = array(
    array('A' => 1, 'AName' => 'TestPC1', 'B' => 2, 'BName' => 'TestHub2'),
    array('A' => 2, 'AName' => 'TestHub2', 'B' => 3, 'BName' => 'Rack3'),
    array('A' => 2, 'AName' => 'TestHub2', 'B' => 4, 'BName' => 'Rack4')
);

$elements = array();

// Build the tree
foreach ($links as $link) {
    if (!isset($elements[$link['A']])) {
        $elements[$link['A']] = array(
            'id' => $link['A'], 'name' => $link['AName'], 
            'data' => array(), 'children' => array()
        );
    }
    if (!isset($elements[$link['B']])) {
        $elements[$link['B']] = array(
            'id' => $link['B'], 'name' => $link['BName'], 
            'data' => array(), 'children' => array()
        );
    } 
    $elements[$link['A']]['children'][$link['B']] = &$elements[$link['B']]; 
}

// Patch up the indices to start from 0
foreach ($elements as &$element) {
    $element['children'] = array_values($element['children']);
}

$elements = array_values($elements);

就个人而言,我不打扰修补索引,如果你不这样做,它会更容易按ID搜索条目。

输入您的父/子数据时要小心,否则您最终会得到一个可爱的循环参考。

您当然需要使用生成数组的合适db命令(mysql_fetch_array等)替换对$links的引用。