PHP 多个逗号隔开的ip转化为ip段

需求说明:
192.168.1.1,192.168.1.2,192.168.1.3,192.168.2.1,192.168.2.2
转化为:
192.168.1.1-192.169.1.3,192.168.2.1-192.168.2.2

上代码:


<?php

$ips = '10.1.24.30,10.1.24.31,10.1.24.32,10.1.24.41,10.1.24.45,10.1.24.50,10.1.24.51,10.1.24.56,10.1.65.101,10.1.65.109,10.1.65.117,10.1.65.122,10.1.65.126,10.1.65.128,10.1.65.129,10.1.65.135,10.1.65.21,10.1.65.22,10.1.65.25,10.1.65.27,10.1.65.55,10.1.65.82,10.1.65.86,10.1.65.87,10.1.65.88,10.1.65.92,10.1.65.93,10.1.68.25,10.1.69.102,10.1.69.104,10.1.69.105,10.1.69.108,10.1.69.112,10.1.69.113,10.1.69.114,10.1.69.116,10.1.69.117,10.1.69.118,10.1.69.123,10.1.69.124,10.1.69.127,10.1.69.128,10.1.69.129,10.1.69.130,10.1.69.131,10.1.69.132,10.1.69.133,10.1.69.134,10.1.69.135,10.1.69.136,10.1.69.137,10.1.69.142,10.1.69.143,10.1.69.145,10.1.69.146,10.1.69.148,10.1.69.149,10.1.69.150,10.1.69.151,10.1.69.152,10.1.69.156,10.1.69.157,10.1.69.158,10.1.69.160,10.1.69.167,10.1.69.170,10.1.69.171,10.1.69.172,10.1.69.173,10.1.69.175,10.1.69.176,10.1.69.177,10.1.69.178,10.1.69.179,10.1.69.180,10.1.69.181,10.1.69.182,10.1.69.183,10.1.69.184,10.1.69.188,10.1.69.189,10.1.69.190,10.1.69.191,10.1.69.192,10.1.69.193,10.1.69.194,10.1.69.195,10.1.69.196,10.1.69.197,10.1.69.198,10.1.69.201,10.1.69.202,10.1.69.203,10.1.69.204,10.1.69.205,10.1.24.43,10.1.69.209,10.1.16.179,10.1.69.50';


// echo bindec(decbin(ip2long('10.1.24.30')));//转整型后不带符号,10位   2238855303
// echo "-------";
// echo bindec(decbin(ip2long('10.1.24.31')));//转整型后不带符号,10位   2238855303
// die;

$re = makeIpRangeStr($ips);
$re = implode(',', $re);
var_dump($re);die;

function makeIpRangeStr($ips){
     $ips_arr = explode(",", $ips);
     $ips_arr = ipsort($ips_arr);
     $ips_range_arr = array();
     $res_ips = [];
     foreach ($ips_arr as $key => $value) {
         $value_arr = explode(".", $value);
         $ips_range_arr[$value_arr[0] . "." . $value_arr[1] . "." . $value_arr[2]][] = $value;
     }
     $arr_res = array();
     foreach($ips_range_arr as $key => $value){
        array_push($res_ips,bbb($value));
     }
    $res_ip = [];

    foreach ($res_ips as $key => $value) {
        foreach($value as $v){
            array_push($res_ip, $v);
        }
    }
    return $res_ip;
}

//整理单个ip段
function bbb($arr){
    $length = count($arr);
    $arr_res = array();
    $arr_res_res = array();
    $arr_item = array();
    for($i=0;$i<$length;$i++){
        array_push($arr_item,$arr[$i]);
        if(isset($arr[$i+1])){
            $t1 = explode(".",$arr[$i+1]);
            $t2 = explode(".",$arr[$i]);
            if(end($t1)-end($t2) == 1){
                
            }else{
                array_push($arr_res,$arr_item);
                $arr_item = array();
            }
        }else{
            array_push($arr_res,$arr_item);
        }
        
    }
    
    foreach($arr_res as $value){
        array_push($arr_res_res,$value[0] . "-" . end($value));
    }
    return $arr_res_res;
    // var_dump($arr_res_res);die;
}

function ipsort($ips){
    $intIps=[];
    $ips_arr = [];
    foreach($ips as $ip){
        array_push($intIps,bindec(decbin(ip2long($ip))));
    }
    sort($intIps);
    foreach($intIps as $intIp ){
        array_push($ips_arr,long2ip($intIp));
    }
    return $ips_arr;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值