php四段拼接ip,合并相同的ip段算法

自己写了个,忽略最后结果重复的问题(这个可以在除重下),谁看看能举出不通过的反例或者提出更好的算法

$arr = array(

'1.1.1.1_4.1.1.8',

'2.2.2.1_5.5.5.5',

'110.3.1.1_194.2.168.1',

'192.168.1.1_223.233.223.1',

'192.165.1.2_193.2.2.1',

'4.4.4.4_6.6.6.6',

'8.8.8.1_10.1.1.1',

'8.1.1.1_9.10.10.10',

'18.1.1.1_19.2.2.2',

'9.0.0.1_12.9.9.10',

'195.0.0.1_225.0.0.1',

'225.0.0.2_225.0.0.111',

'255.0.0.112_255.0.0.220'

);

function getIp($ip){

return bindec(decbin(ip2long($ip)));

}

function trans_to_num($arr){

$ip_num_arr = [];

foreach ($arr as $ip_segment) {

list($startIp,$endIp) = explode('_', $ip_segment);

$ip_num_arr[getIp($startIp)] = getIp($endIp);

}

ksort($ip_num_arr);

return $ip_num_arr;

}

function merge_ip($arr){

$merge_arr = [];

foreach ($arr as $key => $value) {

$merge_arr[]=['start'=>$key,'end'=>$value];

}

$finsh_arr = [];

$tmp = array_shift($merge_arr);

foreach ($merge_arr as $k=>$ip_arr) {

if($ip_arr['start']

continue;

}elseif($ip_arr['start']$tmp['end']){

$tmp['end'] = $ip_arr['end'];

}else{

$finsh_arr[]=$tmp;

$tmp['start'] = $tmp['start'];

if($ip_arr['start']>=$tmp['end']){

$tmp['start'] = $ip_arr['start'];

}

$tmp['end'] = max([$ip_arr['end'],$tmp['end']]);

}

}

$finsh_arr[] = $tmp;

return $finsh_arr;

}

$d = trans_to_num($arr);

$m = merge_ip($d);

echo PHP_EOL;

foreach ($m as $key => $value) {

echo long2ip($value['start']).'---'.long2ip($value['end']).PHP_EOL;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值