За последние 24 часа нас посетили 55059 программистов и 1749 роботов. Сейчас ищут 788 программистов ...

Дерево, топология

Тема в разделе "PHP для новичков", создана пользователем domio, 16 фев 2016.

  1. domio

    domio Активный пользователь

    С нами с:
    18 дек 2012
    Сообщения:
    35
    Симпатии:
    5
    Добрый день
    Хочу нарисовать топологию сети.
    Есть вот такие данные
    надо чтобы скрипт пробежался по эти данным и сформировал такую структуру
    Код (PHP):
    1.                                                          10.11.22.254
    2.                                               /                    |                     \
    3.                                     10.11.22.2           10.11.22.6            10.11.22.4
    4.                                                                       |
    5.                                                                  10.11.22.7               \
    6.                                                                        |
    7.                                                                  10.11.22.8               10.11.22.9
    Подскажите в какую сторону хотя бы копать.
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    предложи хоть какие-то наработки алгоритма-то
     
  3. domio

    domio Активный пользователь

    С нами с:
    18 дек 2012
    Сообщения:
    35
    Симпатии:
    5
    Код (PHP):
    1. // в качестве таблицы БД просто массив
    2. $elems = array(
    3.     array( 'id' => 1, 'pid' => 0, 'title' => '10.11.21.254' ),
    4.     array( 'id' => 2, 'pid' => 1, 'title' => '10.11.21.2' ),
    5.     array( 'id' => 3, 'pid' => 1, 'title' => '10.11.21.3' ),
    6.     array( 'id' => 4, 'pid' => 3, 'title' => '10.11.21.4' ),
    7.     array( 'id' => 5, 'pid' => 0, 'title' => '10.11.21.253' ),
    8.     array( 'id' => 6, 'pid' => 5, 'title' => '10.11.21.14' ),
    9.     array( 'id' => 7, 'pid' => 5, 'title' => '10.11.21.15' ),
    10.     array( 'id' => 8, 'pid' => 5, 'title' => '10.11.21.16' ),
    11.     array( 'id' => 9, 'pid' => 0, 'title' => '10.11.21.252' ),
    12. );
    13.  
    14.  
    15. $links = array();
    16. $tree = array();
    17. for( $q = 0; $q < count( $elems ); $q++ )
    18. {
    19.     $elem = $elems[$q];   
    20.     if( $elem['pid'] === 0 )
    21.     {
    22.         $tree[$elem['id']] = $elem;
    23.         $links[$elem['id']] = &$tree[$elem['id']];
    24.     }
    25.     else
    26.     {
    27.         $links[$elem['pid']]['childrens'][$elem['id']] = $elem;
    28.         $links[$elem['id']] = &$links[$elem['pid']]['childrens'][$elem['id']];
    29.     }
    30. }
    31.  
    32. print_r($tree); 
     
  4. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    че то я не понял по какому принципу выстраивается это чудо
     
  5. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    по парент айди к айди
     
  6. domio

    domio Активный пользователь

    С нами с:
    18 дек 2012
    Сообщения:
    35
    Симпатии:
    5
    Код (PHP):
    1. foreach($table as $ip=>$mac){
    2.     $neigbors = snmpwalk($ip, 'public', '1.0.8802.1.1.2.1.4.1.1.5');
    3.     if($neigbors){
    4.         foreach($neigbors as $neigbor){
    5.             $neigbor_mac = clearHex($neigbor);
    6.             $neigbor_ip = array_search($neigbor_mac, $table);
    7.             $full_table[$ip][] = $neigbor_ip;
    8.         }
    9.     }
    10. }
    11. print_r($full_table); 

    В массиве $table находится список всех ip адресов, перебирая массив на каждый ip адрес отправляется запрос, который возвращает соседей(ip адреса).

    Получается следующий результат(это кусок):
    Код (PHP):
    1.     [10.11.22.2] => Array
    2.         (
    3.             [0] => 10.11.22.254
    4.         )
    5.  
    6.     [10.11.22.3] => Array
    7.         (
    8.             [0] => 10.11.22.11
    9.         )
    10.  
    11.     [10.11.22.4] => Array
    12.         (
    13.             [0] => 10.11.22.254
    14.             [1] => 10.11.22.9
    15.         )
    16.  
    17.     [10.11.22.5] => Array
    18.         (
    19.             [0] => 10.11.22.254
    20.         )
    21.  
    22.     [10.11.22.6] => Array
    23.         (
    24.             [0] => 10.11.22.7
    25.             [1] => 10.11.22.254
    26.         )
    27.  
    28.     [10.11.22.7] => Array
    29.         (
    30.             [0] => 10.11.22.8
    31.             [1] => 10.11.22.6
    32.         )
    33.  
    34.  [10.11.22.254] => Array
    35.         (
    36.             [0] => 10.11.22.251
    37.             [1] => 10.11.22.5
    38.             [2] => 10.11.22.35
    39.             [3] => 10.11.22.2
    40.             [4] => 10.11.22.4
    41.             [5] => 10.11.22.252
    42.             [6] => 
    43.             [7] => 10.11.22.32
    44.             [8] => 10.11.22.6
    45.             [9] => 10.11.22.33
    46.         )
    47.  
    Мне надо этот массив перебрать так, чтобы в конце получилось
    Код (PHP):
    1.  [10.11.22.254] => Array
    2.         (
    3.             [0] => Array(
    4.                          [0]=>10.11.22.3,
    5.                          [1]=>10.11.22.18,
    6.                          [2]=>10.11.22.20,
    7.                          [3]=>10.11.22.22,
    8.                          [4]=>10.11.22.26
    9.                        )
    10.             [1] => 10.11.22.5
    11.             [2] => 10.11.22.35
    12.             [3] => 10.11.22.2
    13.             [4] => 10.11.22.4
    14.             [5] => 10.11.22.252
    15.             [6] => 
    16.             [7] => 10.11.22.32
    17.             [8] => 10.11.22.6
    18.             [9] => 10.11.22.33
    19.         )
    20.  
     
  7. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city