为了账号安全,请及时绑定邮箱和手机立即绑定

合并相同的ip段算法

合并相同的ip段算法

PHP
qq_遁去的一_1 2019-03-17 11:13:25
$arr = array( '1.1.1.1_4.1.1.8', '2.2.2.1_5.5.5.5', '110.1.1.1_194.2.168.1', '192.168.1.1_223.233.223.1', '192.165.1.2_199.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', ); $arr中下划线用来间隔一个ip段的,现在要去合并相同的ip段,得到一个新的数组,不考虑子网掩码,例如,1.1.1.1_192.168.1.1,假设有9.9.9.9或者在这之间的都会合并,最后只保留1.1.1.1_192.168.1.1,算法尽可能效率高一些 怕别人没有听明白:举个例子.1.1.1.1_3.3.3.33.2.2.2_6.6.6.6那么合并后的结果就是:1.1.1.1_6.6.6.6 假设:1.1.1.1_3.3.3.34.4.4.4_6.6.6.6那么合并后的结果不变,还是这两个,因为中间的段有间隔
查看完整描述

3 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

没看明白,要合并发的话,最后只可能有一个结果啊,按楼主的举例来说

1.1.1.1_223.233.223.1 肯定合含了所有段啊,
如果是这样的话,比较最首位的最大值和最小值,分别记录一下不就可以了,但这样,无论数组里面有多少ip段,最后只有一个结果啊

既然楼主修改了问题,也大概明白了
提供一个思路,把Ip 转为 int以后就行比较,应该会比较方便。

function ip2int(ip){
      var num = 0;
      ip = ip.split(".");
      num = Number(ip[0]) * 256 * 256 * 256 + Number(ip[1]) * 256 * 256 + Number(ip[2]) * 256 + Number(ip[3]);
      num = num >>> 0;
      return num;
  }
查看完整回答
反对 回复 2019-03-18
?
万千封印

TA贡献1891条经验 获得超3个赞

用土办法的话:
ip地址4位,
1.首先分段按第一位分段,第一位作为key值,按key升序。
2.分组里面如果大于两个,就要取出最大和最小,第一位固定比较大小其实很容易。比方说1.2.3.4和1.3.4.5,每位最多是三位数,你可以补齐成12位数字,001002003004和001003004005就可以排序出最大和最小了。
3.第一步经过第二步处理后,数据里面的段,就只有一个和两个这样子的类型,按key顺序遍历,处理就好了

查看完整回答
反对 回复 2019-03-18
  • 3 回答
  • 0 关注
  • 772 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信