PHP数组树结构到DB树结构
我在PHP中有一个数据结构,可以使用Telnet连接到交换机,如下所示:PHP数组树结构到DB树结构,php,Php,我在PHP中有一个数据结构,可以使用Telnet连接到交换机,如下所示: Array ( [172.1.1.2] => Array ( [0] => Array ( [IP] => 172.1.1.1 [PlatformBrand] => dlink ) [
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-id4
at172.1.7
at-id8
的父项是什么?编辑:您是如何获得此输入的?抱歉,我写错了,更正了。请从foreach
开始。我们不会在这里为您编写代码。我尝试了很长时间,但找不到正确的代码。数组和所需输出之间的关系是什么?172.1.1.7
at-id4
at172.1.7
at-id8
的父项是什么?编辑:您是如何获得此输入的?抱歉,我写错了,更正了。我运行了您的代码,但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。树结构必须是组合的结果,但仍然要感谢您。