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, и чтобы функция выполнялась по списку, формируя окончательный список результатов?
Просто переберите список диапазонов и используйте 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);
}
Других решений пока нет …