PHP Array树结构到DB树结构

时间:2016-03-06 18:08:20

标签: php

我在PHP中有一个数据结构,使用Telnet连接到交换机,如下所示:

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

for PHP> = 5.3来编写函数代码,任何想法或任何建议?

更新 这是我的书面代码,但不能使用:

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 个答案:

答案 0 :(得分: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。只需在循环中构建查询并执行。