Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: помогите с оптимизацией алгоритма
 
 автор: kaoz   (05.06.2006 в 17:37)   письмо автору
 
 

Цель алгоритма:
В поле формы вводиться диапазон IP адресов, следующим образом:
192.168.5-7,90.123,125-127,130
(запятая означает разовые значения поля адреса, тире означает диапазон с ... по.)
данная строка трактуется как 20 IP адресов:
192.168.5.123
192.168.5.125
192.168.5.126
192.168.5.127
192.168.5.130
192.168.6.123
192.168.6.125
192.168.6.126
192.168.6.127
192.168.6.130
192.168.7.123
192.168.7.125
192.168.7.126
192.168.7.127
192.168.7.130
192.168.90.123
192.168.90.125
192.168.90.126
192.168.90.127
192.168.90.130

Мое решение:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Добавить пользователя</title>
<style type="text/css">
<!--
input, select
  {
    position:absolute;
    left:120px;
    width:145px;
  }
.submit, .sel
  {
    width:150px;
  }
-->
</style></head>

<body>
<?php if(!isset($_POST['submit'])) {?>
<!-- Форма добавления пользователя -->
<form id="authorization" action="adduser.php" method="POST">
    <label>Диапазон IP:
        <input name="ip" type="text" value="" />
    </labe>
    <br />
    <br />
    <input class="submit" name="submit" type="submit" value="Ok" />
</form>
<?php 
  

else
  {
    
extract($_POST);

    
$level1        ".";
    
$level2        ",";
    
$level3        "-";
        
    
$range_l1 explode($level1$ip);
    
$count_l1 count($range_l1);

    
$a 0;

    for(
$i=0;$i<$count_l1;$i++)
      {
        
$range_l2 explode($level2$range_l1[$i]);

        if(!empty(
$range_l2[1]))
          {
            
$count_l2 count($range_l2);
            for(
$j=0;$j<$count_l2;$j++)
              {
                
$range_l3 explode($level3$range_l2[$j]);

                if(!empty(
$range_l3[1]))
                  {
                    for(
$k=$range_l3[0];$k<=$range_l3[1];$k++)
                      {
                        
$ips[$i][$a] = $k;
                        
$a++;
                      }
                  }
                else 
                  {
                    
$ips[$i][$a] = $range_l2[$j];
                    
$a++;
                  }
              }
          }
        else
          {
            
$ips[$i][$a] = $range_l1[$i];
            
$a++;
          }
        
$a 0;
      }
    
    for(
$i=0;$i<4;$i++)
      {
        
$count[$i] = count($ips[$i]);
      }

    for(
$i=0;$i<$count[0];$i++)
      {
        for(
$j=0;$j<$count[1];$j++)
          {
            for(
$k=0;$k<$count[2];$k++)
              {
                for(
$x=0;$x<$count[3];$x++)
                  {
                    echo 
$ips[0][$i].".".$ips[1][$j].".".$ips[2][$k].".".$ips[3][$x]."<br />\n";
                    
$fff++;
                  }
              }
          }
      }
  }
?>

<!-- Конец -->
</body>
</html>


что можно сделать чтобы упростить данный скрипт???

   
 
 автор: Саня   (05.06.2006 в 19:39)   письмо автору
 
   для: kaoz   (05.06.2006 в 17:37)
 

А зачем? Он что, плохо работает? Или медленно?

   
 
 автор: kaoz   (06.06.2006 в 08:19)   письмо автору
 
   для: Саня   (05.06.2006 в 19:39)
 

большой слишком... чувствую что можно проще сделать, но ничего в голову пока не приходит.. может у кого мысли есть?

   
 
 автор: Loki   (06.06.2006 в 09:40)   письмо автору
 
   для: kaoz   (06.06.2006 в 08:19)
 

Я бы переводил ip адреса в число и уже затем сравнивал. В итоге скрипт сократится до нескольких строчек.

   
 
 автор: kaoz   (06.06.2006 в 09:47)   письмо автору
 
   для: Loki   (06.06.2006 в 09:40)
 

????
Вы не могли бы попобробнее объяснить??

   
 
 автор: kaoz   (06.06.2006 в 09:50)   письмо автору
 
   для: kaoz   (06.06.2006 в 09:47)
 

нашел в скрипте ошибку
если вводить без запятых диапазон, то тогда диапазон не разбирается..
вообщем модернизировал следующим образом:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Добавить пользователя</title>
<style type="text/css">
<!--
input
  {
    position:absolute;
    left:120px;
    width:145px;
  }
.submit
  {
    width:150px;
  }
#border
  {
    background-color    : #EEEEEE;
    border-width        : 1px;
    border-color        : #000000;
    border-style        : dashed;
    padding-top            : 10px;
    padding-bottom        : 10px;
    padding-left        : 10px;
    padding-right        : 10px;
  }
-->
</style></head>

<body>
<?php 

if(!empty($_POST['submit'])) 
  {
    
extract($_POST);

    
$level1        ".";
    
$level2        ",";
    
$level3        "-";
        
    
$range_l1 explode($level1$ip);
    
$count_l1 count($range_l1);

    
$a 0;

    for(
$i=0;$i<$count_l1;$i++)
      {
        
$range_l2 explode($level2$range_l1[$i]);

//        if(!empty($range_l2[1]))
//          {
            
$count_l2 count($range_l2);
            for(
$j=0;$j<$count_l2;$j++)
              {
                
$range_l3 explode($level3$range_l2[$j]);

                if(!empty(
$range_l3[1]))
                  {
                    for(
$k=$range_l3[0];$k<=$range_l3[1];$k++)
                      {
                        
$ips[$i][$a] = $k;
                        
$a++;
                      }
                  }
                else 
                  {
                    
$ips[$i][$a] = $range_l2[$j];
                    
$a++;
                  }
              }
//          }
//        else
//          {
//            $ips[$i][$a] = $range_l1[$i];
//            $a++;
//          }
        
$a 0;
      }
    
    for(
$i=0;$i<4;$i++)
      {
        
$count[$i] = count($ips[$i]);
      }

    echo 
"<div id=\"border\">\n";
    
$fff 0;
    for(
$i=0;$i<$count[0];$i++)
      {
        for(
$j=0;$j<$count[1];$j++)
          {
            for(
$k=0;$k<$count[2];$k++)
              {
                echo 
"    <div id=\"col_$k\">\n";
                for(
$x=0;$x<$count[3];$x++)
                  {
                    echo 
"        ".$ips[0][$i].".".$ips[1][$j].".".$ips[2][$k].".".$ips[3][$x]."<br />\n";
                    
$fff++;
                  }
                echo 
"    </div>\n";
              }
          }
      }
    echo 
"</div>\n";
  }
?>
<!-- Форма добавления пользователя -->
<form id="authorization" action="adduser.php" method="POST">
    <label>Диапазон IP:
        <input name="ip" type="text" value="" />
    </labe>
    <br />
    <br />
    <input class="submit" name="submit" type="submit" value="Ok" />
</form>

<!-- Конец -->
</body>
</html>

   
 
 автор: Trianon   (06.06.2006 в 10:54)   письмо автору
 
   для: kaoz   (06.06.2006 в 09:50)
 


<?
    
function r2s($list)
    {
        
$s = array();
        foreach(
explode(',',$list) as $el)
        {
           
$b explode('-'$el);
           if(!isset(
$b[1]))  $b[1] = $b[0];
           list(
$p$q) = $b;
           while(
$p <= $q$s[] = intval($p++);
        }
        return 
$s;
    }

    
$ip="192.168.5-7,90.123,125-127,130";
    
$res = array();

    for(
$r1 explode('.'$ip), $i count($r1); --$i >= 0;)
    {
        if(empty(
$res))
          foreach(
r2s($r1[$i]) as $v)
            
$res[] = "$v";
        else
        {
          
$s = array();
          foreach(
r2s($r1[$i]) as $v)
            foreach(
$res as $w)
            
$s[] = "$v.$w";
          
$res $s;
        }
    }
    foreach(
$res as $v)
        echo 
"$v<br>";
?>

   
 
 автор: kaoz   (06.06.2006 в 11:17)   письмо автору
 
   для: Trianon   (06.06.2006 в 10:54)
 

вы не могли бы прокомментировать?

   
 
 автор: Trianon   (06.06.2006 в 12:02)   письмо автору
 
   для: kaoz   (06.06.2006 в 11:17)
 

Функция r2s преобразует запись списка диапазонов (т.е. строку вида '1,3-6,8' ) в множество чисел (т.е. array(1,3,4,5,6,8) )
Цикл ниже строит соединения этих множеств.

   
 
 автор: Loki   (06.06.2006 в 13:34)   письмо автору
 
   для: kaoz   (06.06.2006 в 11:17)
 

<?
function ip_to_val($ip)
{
 
$tmp=explode("."$ip);
 
$val=256*256*256*$tmp[0]+256*256*$tmp[1]+256*$tmp[2]+$tmp[3];
 return 
$val;
}
$ip="195.200.200.9";
$diapazon="195.200.200.0-195.200.200.255";
list(
$begin_ip$end_ip)=explode("-"$diapazon);
if (
ip_to_val($begin_ip)<=ip_to_val($ip) && ip_to_val($end_ip)>=ip_to_val($ip))
echo 
"ip попадает в указанный диапазон";

   
 
 автор: kaoz   (06.06.2006 в 16:38)   письмо автору
 
   для: Loki   (06.06.2006 в 13:34)
 

крута, спасибо за помощь...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования