首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP如何通过CIDR函数运行网段列表?

PHP如何通过CIDR函数运行网段列表?
EN

Stack Overflow用户
提问于 2018-06-20 03:45:31
回答 1查看 250关注 0票数 0

IP2Location.com有一个可以将单个IP范围转换为CIDR格式的有效函数。我想定期提供一个IP范围列表(一个数组?)通过函数获取CIDR格式的结果列表。我不确定如何用PHP正确地做到这一点,也许它是错误的工具?如有任何指导,敬请惠顾。下面是函数,输入/输出示例如下:

代码语言:javascript
复制
function iprange2cidr($ipStart, $ipEnd){
    if (is_string($ipStart) || is_string($ipEnd)){
        $start = ip2long($ipStart);
        $end = ip2long($ipEnd);
    }
    else{
        $start = $ipStart;
        $end = $ipEnd;
    }
    $result = array();
    while($end >= $start){
        $maxSize = 32;
        while ($maxSize > 0){
            $mask = hexdec(iMask($maxSize - 1));
            $maskBase = $start & $mask;
            if($maskBase != $start) break;
            $maxSize--;
        }
        $x = log($end - $start + 1)/log(2);
        $maxDiff = floor(32 - floor($x));
        if($maxSize < $maxDiff){
            $maxSize = $maxDiff;
        }
        $ip = long2ip($start);
        array_push($result, "$ip/$maxSize");
        $start += pow(2, (32-$maxSize));
    }
    return $result;
}
function iMask($s){
    return base_convert((pow(2, 32) - pow(2, (32-$s))), 10, 16);
}

然后测试该函数,提供一个范围,ipStart为8.8.8.0,ipEnd为8.8.8.16,函数的CIDR结果是一个数组,使用implode回显:

代码语言:javascript
复制
$ipStart = '8.8.8.0';
$ipEnd = '8.8.8.16';
$ipCidr = iprange2cidr($ipStart, $ipEnd);
echo implode ("<br>", $ipCidr);

CIDR格式的结果为:

代码语言:javascript
复制
8.8.8.0/28
8.8.8.16/32

这在单个范围内运行良好。您建议如何将范围列表提供给ipStart和ipEnd变量,并让函数遍历该列表,构建最终结果列表?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-20 04:25:37

只需遍历范围列表,并使用array_merge()将结果附加到所有结果的集合中。

代码语言:javascript
复制
$ranges = [
    ["start" => "8.8.8.0", "end" => "8.8.8.16"],
    ["start" => "192.168.10.5", "end" => "192.168.32.255"],
    ["start" => "10.1.2.32", "end" => "10.1.3.0"]
];
$allCidrs = [];
foreach ($ranges as $range) {
    $cidr = iprange2cidr($range["start"], $range["end"]);
    $allCidrs = array_merge($allCidrs, $cidr);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50935871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档