Php парсинг массива

252
19 августа 2017, 03:12

Добрый день! Помогите пожалуйста со следующим вопросом. Дано IPv4 адреса и список подсетей к которым они должны принадлежать. Задача сопоставить ип адреса с подсетями к которым они принадлежат. Все подсети /27. Я перевел ип адреса и подсети через ip2long в значения без точки. получилось 2 массива

    $pop
array(2) {
  [0]=>
  int(168430090)
  [1]=>
  int(179996486)
}
$net_range
array(4840) {
  [0]=>
  array(2) {
    ["host_min"]=>
    string(10) "1509562368"
    ["host_max"]=>
    string(10) "1509562399"
  }
  [1]=>
  array(2) {
    ["host_min"]=>
    string(9) "174424480"
    ["host_max"]=>
    string(9) "174424511"
  }
  [2]=>
  array(2) {
    ["host_min"]=>
    string(9) "174424512"
    ["host_max"]=>
    string(9) "174424543"
      }

Вот сам код

<?php
#translate ip to align ($pop)
$ip =file ('IP_LS_ID', FILE_IGNORE_NEW_LINES);
foreach ($ip as $value) {
        $pop[]=ip2long($value);
}
#getting subnets /27
$link = mysql_connect('10.0.0.220', 'dhcp', '1234')
        or die ('connect error! '. mysql_error());
        echo "Connected \n";
mysql_select_db('dhcpdb') or die ('ne mogu v database!');
$query = mysql_query("select subnet from dhcpdb.sharenetwork where city=8 and netmask=inet_aton('255.255.255.224')");
while ($row=mysql_fetch_assoc($query)){
        $nets[]=$row;
}
foreach ($nets as $net){
        $net_max=$net[subnet] + 31;
        $net_range[]=array('host_min'=>"$net[subnet]", 'host_max'=>"$net_max");
}
var_dump($net_range);
?>

После этого я встал в тупик и не могу понят как распарсить между собой эти 2 массива, можете указать как это будет проще и эффективней? На выходе хочу получить сроку с IP subnet и так для всех 20000 ип адресов

Answer 1

Думаю раз маски везде одинаковые, лучше запомнить факт наличия подсетей в ассоциативном массиве:

while ($row=mysql_fetch_assoc($query)){
        $nets[$row['subnet']]=1;
}

потом идем в цикле по массиву ip-адресов и делаем:

if( isset($nets[$ip & 0xFFFFFFE0]) ) {
   подсеть найдена, можно печатать то что хотели
}

Пользуемся тем фактом, что IP & маска-подсети дает нам как раз саму подсеть.

READ ALSO
Существует ли аналог imagettfbbox() в ImageMagick?

Существует ли аналог imagettfbbox() в ImageMagick?

ПриветствуюИщу аналог функции php/GD imagettfbbox() в php/ImageMagick, так как во всём приложении используется php/ImageMagick и ради одной функции ставить GD как-то...

259
yii2 убрать в форме у имён полей префикс имени модели

yii2 убрать в форме у имён полей префикс имени модели

Как убрать в форме у имён полей префикс имени моделиСейчас поля такие (смотри ниже)

280
Убрать keyboard после клика telegram bot

Убрать keyboard после клика telegram bot

Бот создает клавиатуру в ответе:

719
Вырезать последний тег и его содержимое

Вырезать последний тег и его содержимое

ЗдравствуйтеЕсть текст, в котором следующие содержание:

264