PHP Как запустить список диапазонов IP-адресов через функцию CIDR?

IP2Location.com имеет работающую функцию PHP для преобразования ОДНОГО диапазона IP-адресов в формат CIDR. Я хочу периодически передавать СПИСОК диапазонов IP-адресов (массив?) через функцию, чтобы получить список результатов в формате CIDR. Я не уверен, как правильно это сделать с PHP, и, возможно, это неправильный инструмент? Любое руководство приветствуется. Вот функция с примером ввода/вывода ниже:

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:

$ipStart = '8.8.8.0';
$ipEnd = '8.8.8.16';
$ipCidr = iprange2cidr($ipStart, $ipEnd);
echo implode ("<br>", $ipCidr);

Результат в формате CIDR:

8.8.8.0/28
8.8.8.16/32

Это хорошо работает для одного диапазона. Как бы вы предложили передать список диапазонов в переменные ipStart и ipEnd и запустить функцию по списку, создав окончательный список результатов?


person gimbal    schedule 19.06.2018    source источник


Ответы (1)


Просто просмотрите список диапазонов и используйте array_merge(), чтобы добавить результаты в коллекцию всех результатов.

$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);
}
person Barmar    schedule 19.06.2018