Создание многомерного массива из БД - PullRequest
0 голосов
/ 19 февраля 2010

Я действительно надеюсь, что кто-то может помочь мне с этим. Я борюсь с этим уже почти два дня ...

У меня есть БД-таблица «Устройство» и таблица «Соединение». Я использую его для визуализации сети моей компании. Для передачи данных в 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-данные в этот массив?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2010

Допустим, вы хотите сделать это в PHP с использованием этой таблицы, например, ради, я буду использовать массив для представления возвращаемых данных базы данных после JOIN между данной таблицей и тем, что я представляю, как ID-> Name таблица сопоставления:

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

Лично я бы не стал исправлять индексы, это облегчит поиск записей по идентификатору позже, если вы этого не сделаете.

Будьте внимательны при вводе данных о родителях / детях, иначе вы получите прекрасную круговую ссылку.

Вам, конечно, нужно заменить ссылки на $links подходящей командой db, которая создает массив (mysql_fetch_array и т. Д.).

0 голосов
/ 19 февраля 2010

Я предлагаю вам просмотреть (как этот сайт, так и Интернет в целом) на предмет "как представлять деревья в РСУБД".

Начало здесь , может быть.

В зависимости от того, сколько «деревьев» вам нужно управлять, и максимальной глубины вашей иерархии, различные подходы могут быть более или менее осуществимыми.

...