2013-03-23 3 views
1

그래서 같은 IP의 CIDR의 또는 단일 IP의 배열을 받아 아래의 기능을 가지고 기타사용자 정의 함수가 false를 반환해야하는 경우 true를 반환합니까?

$cidrs = array("127.0.0.1","65.87.43.65/32"); 

..

함수는 다음 주어진 IP가 잘 들어 있는지 여부를 확인

IP 및 CIDR의 배열, CIDR에 있든 단일 IP로 지정 되든 상관 없습니다.

IP에 CIDR 마스크가 없으면 IP가 목록에 있는지에 관계없이 항상 true를 반환합니다.

적어도 한 번은 효과가 있었지만 다르게 작동하도록 변경 한 내용을 알지 못합니다.

기능은 다음과 같습니다 :

function testIP($user_ip, $cidrs) 
{ 
    $ipu = explode('.', $user_ip); 
    foreach ($ipu as &$v) 
     $v = str_pad(decbin($v), 8, '0', STR_PAD_LEFT); 

    $ipu = join('', $ipu); 
    $res = false; 

    foreach ($cidrs as $cidr) 
    { 

     $parts = explode('/', $cidr); 

     if (empty($parts)) 
     { 
      if (in_array($user_ip, $cidrs)) 
      { 
       $res = true; 
       break; 
      } 
      break;   
     } 



     $ipc = explode('.', $parts[0]); 

     foreach ($ipc as &$v) $v = str_pad(decbin($v), 8, '0', STR_PAD_LEFT); 

     $ipc = substr(join('', $ipc), 0, $parts[1]); 

     $ipux = substr($ipu, 0, $parts[1]); 
     $res = ($ipc === $ipux); 
     if ($res) break; 
    } 
    return $res; 
} 

나는 내 인생이 해결할 수없는 것이 더 이상 작업을하는 이유 -이 이상의 많은 시간이 손실되지 않았습니다!

답변

1

explode은 항상 배열을 반환합니다. if (empty(... 수표가 잘못되었습니다. 다음 if (count($parts)==1)$res = in_array($user_ip, $cidrs)

편집을 시도해보십시오 또한, 아프게하지 않는, 오히려 다음 CIDR 계속 :

if (count($parts)==1) 
    { 
     if (in_array($user_ip, $cidrs)) 
     { 
      $res = true; 
      break; 
     } 
     continue;   
    } 
+0

일한 그, 감사합니다! 빈 배열을 반환 할 것이라고 말한대로 빈 함수를 사용하고 explode 함수의 문서에서 구분 기호 텍스트가 압축 텍스트에없는 경우 빈 배열이 반환됩니다. 어쨌든, 이것은 효과가있었습니다 - 정말 고마워요! –

+0

편집했는데 다른 문제가 있습니다. –

+0

두 번째 생각에, 어쩌면 그 휴식이 필요합니다. 흠. 나는 그것에 대해 생각해야만한다. –

관련 문제