2010-02-19 4 views
0

Я действительно надеюсь, что кто-то может мне помочь. Я борюсь с ним в течение почти двух дней ...Создание многомерного массива из базы данных

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

кто-нибудь есть идея, как получить из БД-данных в этом массиве?

спасибо.

ответ

0

Предположим, вы хотите сделать это на 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

Вы бог. Большое спасибо! – user276289

0

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

Начало here, возможно.

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

Смежные вопросы