Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP数组树结构到DB树结构_Php - Fatal编程技术网

PHP数组树结构到DB树结构

PHP数组树结构到DB树结构,php,Php,我在PHP中有一个数据结构,可以使用Telnet连接到交换机,如下所示: Array ( [172.1.1.2] => Array ( [0] => Array ( [IP] => 172.1.1.1 [PlatformBrand] => dlink ) [

我在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
但我想把它转换成树状结构,如下所示:

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编写的函数代码,有什么想法或建议吗

更新: 以下是我编写的代码,但无法使用:

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
            =>  ...

...
用这个

$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
。只需在循环中建立查询并执行即可。

使用此选项

$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
。只需在循环中建立查询并执行。

从一个
foreach
开始。我们不会在这里为您编写代码。我尝试了很长时间,但找不到正确的代码。数组和所需输出之间的关系是什么?
172.1.1.7
at-id
4
at
172.1.7
at-id
8
的父项是什么?编辑:您是如何获得此输入的?抱歉,我写错了,更正了。请从
foreach
开始。我们不会在这里为您编写代码。我尝试了很长时间,但找不到正确的代码。数组和所需输出之间的关系是什么?
172.1.1.7
at-id
4
at
172.1.7
at-id
8
的父项是什么?编辑:您是如何获得此输入的?抱歉,我写错了,更正了。我运行了您的代码,但id为4的172.1.1.7是id为8的172.1.1.7的父级。这来自您的数组;172.1.1.7是172.1.1.2(第一个家长)的孩子,而另一个172.1.1.7是172.1.1.11(第三个家长)的家长-您可能想确认这是正确的?我的代码侧重于提供的数组的层次结构,但如果您希望同时将一个子数组作为父数组,则可能需要引入另一个数组来跟踪主数组中的唯一IP。树结构必须是组合的结果,但仍然要感谢您。我运行了您的代码,但是id为4的172.1.1.7是id为8的172.1.1.7的父级;172.1.1.7是172.1.1.2(第一个家长)的孩子,而另一个172.1.1.7是172.1.1.11(第三个家长)的家长-您可能想确认这是正确的?我的代码主要关注所提供数组的层次结构,但如果您希望同时将一个子数组作为父数组,则可能需要引入另一个数组来跟踪主数组中的唯一IP。树结构必须是组合的结果,但仍然要感谢您。