За последние 24 часа нас посетили 15669 программистов и 1560 роботов. Сейчас ищут 899 программистов ...

как конвертировать из массива ip адресов массив cidr?

Тема в разделе "PHP для новичков", создана пользователем sense1, 16 мар 2017.

  1. sense1

    sense1 Новичок

    С нами с:
    16 фев 2017
    Сообщения:
    35
    Симпатии:
    1
    Привет! у меня есть файл в котором содержатся ip адреса, нужно сделать конверт в cidr формат.

    Подскажите или направьте с решением! заранее спасибо.

    $ arr = [
    '42.0.24.0-42.0.27.255,"CN","China Telecom fujian"',
    '42.83.88.0-42.83.127.255,"PK","China Telecom Guangdong"',
    '43.254.36.0-43.254.36.255,"JP","China Telecom Beijing"',
    '223.223.176.0-223.223.191.255,"KH","China Telecom Beijing"',
    '27.121.72.0-27.121.79.255,"AU","China Telecom Guangdong"]
     
  2. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @sense1 array_walk+регулярка?
     
  3. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    lib.php
    PHP:
    1. <?php
    2. function cidr2ip($cidr)
    3. {
    4.     $ip_arr = explode('/', $cidr);
    5.     $start = ip2long($ip_arr[0]);
    6.     $nm = $ip_arr[1];
    7.     $num = pow(2, 32 - $nm);
    8.     $end = $start + $num - 1;
    9.     return array($ip_arr[0], long2ip($end));
    10. }
    11. function ip2cidr($ips)
    12. {
    13.     $return = array();
    14.     $num = ip2long($ips[1]) - ip2long($ips[0]) + 1;
    15.     $bin = decbin($num);
    16.     $chunk = str_split($bin);
    17.     $chunk = array_reverse($chunk);
    18.     $start = 0;
    19.     while ($start < count($chunk))
    20.     {
    21.         if ($chunk[$start] != 0)
    22.         {
    23.             $start_ip = isset($range) ? long2ip(ip2long($range[1]) + 1) : $ips[0];
    24.             $range = cidr2ip($start_ip . '/' . (32 - $start));
    25.             $retval[] = $start_ip . '/' . (32 - $start);
    26.         }
    27.         $start++;
    28.     }
    29.     return $retval;
    30. }
    some.php
    PHP:
    1. <?php
    2. include 'lib.php';
    3.  
    4. $arr = [
    5. '42.0.24.0-42.0.27.255,"CN","China Telecom fujian"',
    6. '42.83.88.0-42.83.127.255,"PK","China Telecom Guangdong"',
    7. '43.254.36.0-43.254.36.255,"JP","China Telecom Beijing"',
    8. '223.223.176.0-223.223.191.255,"KH","China Telecom Beijing"',
    9. '27.121.72.0-27.121.79.255,"AU","China Telecom Guangdong"'];
    10. foreach($arr as $val){
    11.     $str=explode(',', $val);
    12.     $ips = explode('-',$str[0]);
    13.     $cidp = ip2cidr([$ips[0],$ips[1]]);
    14.     $newarr[]=implode('-',$cidp).",$str[1],$str[2]";
    15. }
    16. print_r($newarr);
    Результат
    Код (Text):
    1. Array
    2. (
    3.     [0] => 42.0.24.0/22,"CN","China Telecom fujian"
    4.     [1] => 42.83.88.0/21-42.83.96.0/19,"PK","China Telecom Guangdong"
    5.     [2] => 43.254.36.0/24,"JP","China Telecom Beijing"
    6.     [3] => 223.223.176.0/20,"KH","China Telecom Beijing"
    7.     [4] => 27.121.72.0/21,"AU","China Telecom Guangdong"
    8. )
    Только учти,некоторые диапазоны могут давать сразу 2 строки,поэтому те которые дают 2 строки я разделил с помощью ' - '.Естественно ты можешь при желании изменить разделитель на другой.
     
    denis01 и sense1 нравится это.
  4. sense1

    sense1 Новичок

    С нами с:
    16 фев 2017
    Сообщения:
    35
    Симпатии:
    1
    спасибо!