我有一个存储 IP 地址的数据库表,如下所示:
E_ID IP MASK
我想让它看起来像这样:
E_ID Parent_ID IP MASK
这样我就可以轻松获得我的 IP 地址树:
80.17.0.0/18 (id=1 parent id = -1)
80.17.0.0/24 (id=2, parent id=1)
80.17.0.0/27 (id=3, parent id=2)
80.17.0.0/31 (id=4, parent id=3)
80.17.0.2/31 (id=5, parent id=3)
80.17.0.4/31 (id=6, parent id=3)
80.17.0.6/31 (id=7, parent id=3)
80.17.0.8/31 (id=8, parent id=3)
80.17.0.12/31 (id=9, parent id=3)
80.17.0.32/27 (id=10, parent id=2)
80.17.0.32/30 (id=11, parent id=10)
80.17.0.32/32 (id=12, parent id=11)
80.17.0.33/32 (id=13, parent id=11)
80.17.0.34/32 (id=14, parent id=11)
80.17.0.35/32 (id=15, parent id=11)
所有 IP 和掩码都是 BINGINT (ip2long())。我想出了什么:
$sql = "SELECT IP, Mask, E_ID
FROM test
ORDER BY `IP`, `Mask` ASC";
$result = mysqli_query($db, $sql) or die(mysqli_error($db));
$space = array();
$i = 0;
array_push($space, mysqli_fetch_assoc($result));
while($r = mysqli_fetch_assoc($result)){
if(!ipvsnet(long2ip($r['IP']), long2ip($space[$i]['IP']), long2ip($space[$i]['Mask']))){
array_push($space, $r);
$i++;
}
function ipvsnet($ip, $network, $mask){
if(((ip2long($ip))&(ip2long($mask))) == ip2long($network)){
return 1;
} else {
return 0;
}
}
这给了我主要的父母地址。我不明白如何找到更深的节点,因为我不知道每个分支有多深。先感谢您。