2016-03-06 162 views
1

我在PHP有一个数据结构来连接使用Telnet这样的开关:PHP阵列树状结构DB树结构

Array 
(
    [172.1.1.2] => Array 
     (
      [0] => Array 
       (
        [IP] => 172.1.1.1 
        [PlatformBrand] => dlink 
       ) 

      [1] => Array 
       (
        [IP] => 172.1.1.5 
        [PlatformBrand] => dlink 
       ) 

      [2] => Array 
       (
        [IP] => 172.1.1.7 
        [PlatformBrand] => dlink 
       ) 

      [3] => Array 
       (
        [IP] => 172.1.1.8 
        [PlatformBrand] => dlink 
       ) 

     ) 

    [172.1.1.6] => Array 
     (
      [0] => Array 
       (
        [IP] => 172.1.1.10 
        [PlatformBrand] => dlink 
       ) 
     ) 

    [172.1.1.7] => Array 
     (
      [0] => Array 
       (
        [IP] => 172.1.1.11 
        [PlatformBrand] => dlink 
       ) 
      [1] => Array 
       (
        [IP] => 172.1.1.14 
        [PlatformBrand] => dlink 
       ) 
     ) 
) 

但我想转换成树这个像这样的结构:

CREATE TABLE `network_equipment_class` (
    `id` int(11) NOT NULL, 
    `ip` varchar(15) NOT NULL, 
    `parent` int(11) NOT NULL, 
    `sort` int(11) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

id | ip   | parent | sort 
-------------------------------- 
1 | 172.1.1.2 | 0  | 0 
2 | 172.1.1.1 | 1  | 0 
3 | 172.1.1.5 | 1  | 1 
4 | 172.1.1.7 | 1  | 2 
5 | 172.1.1.8 | 1  | 3 
6 | 172.1.1.6 | 0  | 1 
7 | 172.1.1.10 | 6  | 0 
8 | 172.1.1.11 | 4  | 0 
9 | 172.1.1.14 | 4  | 1 

对于PHP> = 5.3来书写功能代码,任何想法或任何建议?

UPDATE: 这里是我写的代码,但不能使用:

function createDBTree($IP, $dbTree){ 
    if (!is_array($dbTree) || $dbTree == array()) { 
     $dbTree = array('ip' => $IP); 
    } else { 
     foreach ($dbTree as $dbkey => $tmpdbvalue) { 
      if(is_array($tmpdbvalue) && $arr !== array()) { 
       if (!isset($tmpdbvalue['children'])) $dbTree = $this->createDBTree($IP, $tmpdbvalue['children']); 
      } else { 
       if ($tmpdbvalue['ip'] == $IP) $tmpdbvalue['children'] = array('ip' => $IP); 
      } 
     } 
    } 

    return $dbTree; 
} 

最后,我将完成结构:

172.1.1.2 => 172.1.1.1 
      => 172.1.1.5 
      => 172.1.1.7 => 172.1.1.11 => ... => ... 
          => 172.1.1.14 
          => ... 
      => 172.1.1.8 
      => ... 

172.1.1.6 => 172.1.1.10 
      => ... 

... 
+1

以'foreach'开头。我们不会在这里为你写代码。 –

+0

我已经尝试了很长时间,但无法找到正确的书面。 –

+0

数组与期望输出之间的关系是什么? 'id'为'172.1.1.7','id为'8为'172.1.1.7'的父节点是什么?编辑:你怎么得到这个输入? – FirstOne

回答

0

使用本。

$arr = array('172.1.1.2' => array(
           array('IP' => '172.1.1.1','PlatformBrand' => 'dlink'), 
           array('IP' => '172.1.1.5','PlatformBrand' => 'dlink'), 
           array('IP' => '172.1.1.7','PlatformBrand' => 'dlink'), 
           array('IP' => '172.1.1.8','PlatformBrand' => 'dlink') 
          ), 
      '172.1.1.6' => array(
           array('IP' => '172.1.1.10','PlatformBrand' => 'dlink') 
          ), 
      '172.1.1.7' => array(
           array('IP' => '172.1.1.11','PlatformBrand' => 'dlink'), 
           array('IP' => '172.1.1.14','PlatformBrand' => 'dlink') 
          ),         
      );     
$sn = $parent = $sort = 0; 
$hdr = "id | ip | parent | sort\r\n"; 
$hdr .= "--------------------------------\r\n"; 
foreach($arr as $k => $v){ 
    $sn++; 
    $hdr .= "$sn | $k | $parent | $sort \r\n"; 
    $parent = $sn; 
    foreach($v as $t => $d){ 
    $sn++; 
    $hdr .= "$sn | {$d['IP']} | $parent | $sort \r\n"; 
    $sort++; 
    } 
    $parent = 0; 
    $sort = 0; 
} 

echo nl2br($hdr); 

记住,你在你的问题有阵列的输出,所以你必须把它格式化成PHP数组你迭代它之前。

如果您正在写入数据库,您当然不需要换行符"\n\r"nl2br。只需在循环中构建查询并执行即可。

+0

我运行你的代码[这里](https://3v4l.org/QFmPd),但是172.1.1.7在id 4时是172.1.1.7的id在父母id。 –

+0

这是来自你的数组; 172.1.1.7是172.1.1.2(第一父母)的孩子,另一个172.1.1.7是172.1.1.11(第三父母)的父母 - 您可能想确认这是否正确?我的代码重点关注所提供数组的层次结构,但是如果您希望子级同时成为父级,则可能需要引入另一个数组来跟踪主数组中的唯一IP。 –

+0

树结构是必须结合的结果,但还是谢谢你。 –