合并相同的ip段算法
$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.3
3.2.2.2_6.6.6.6
那么合并后的结果就是:1.1.1.1_6.6.6.6
假设:
1.1.1.1_3.3.3.3
4.4.4.4_6.6.6.6
那么合并后的结果不变,还是这两个,因为中间的段有间隔
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
自己写了个,忽略最后结果重复的问题(这个可以在除重下),谁看看能举出不通过的反例或者提出更好的算法
没看明白,要合并发的话,最后只可能有一个结果啊,按楼主的举例来说
1.1.1.1_223.233.223.1 肯定合含了所有段啊,
如果是这样的话,比较最首位的最大值和最小值,分别记录一下不就可以了,但这样,无论数组里面有多少ip段,最后只有一个结果啊
既然楼主修改了问题,也大概明白了
提供一个思路,把Ip 转为 int以后就行比较,应该会比较方便。
用土办法的话:
ip地址4位,
1.首先分段按第一位分段,第一位作为key值,按key升序。
2.分组里面如果大于两个,就要取出最大和最小,第一位固定比较大小其实很容易。比方说1.2.3.4和1.3.4.5,每位最多是三位数,你可以补齐成12位数字,001002003004和001003004005就可以排序出最大和最小了。
3.第一步经过第二步处理后,数据里面的段,就只有一个和两个这样子的类型,按key顺序遍历,处理就好了