2015-10-18 2 views
0

Есть ли способ сопоставить часть строки внутри массива в PHP?Как совместить часть строки внутри массива - PHP

Я хотел был бы утвердить ip пользователя против разрешенных IP. Поэтому я создал массив с IP-адресами и отвечающий партнер_ид. Это работает, однако я также хочу разрешить всю подсеть и, следовательно, нужно будет обрабатывать часть массива. Это возможно?

Это мой код:

# define partner IPs 
$partner_ips = array(
         '192.168.56.1'  => 0, // dev 
         '192.168.57.*'  => 1 // office ips      
); 
# test for partner IP and associate partner_id if found 
if (array_key_exists($_SERVER['REMOTE_ADDR'], $partner_ips)) 
    $partner_id = $partner_ips[$_SERVER['REMOTE_ADDR']]; 
else 
    $partner_id = false; 

Спасибо за любую помощь по этому вопросу.

+1

Ознакомьтесь с функциями массива PHP. Особенно функция 'array_walk()' с функцией обратного вызова. – arkascha

+0

Что такое ваша версия php? –

+0

Моя версия php - 5.6. * – merlin

ответ

1

Проверьте формат IP-первых. Создайте два разных массива: один для полных ip-адресов и один для подсетей. Пример класса (не стесняйтесь, чтобы сделать его PSR-2 соответствует, так как вы используете PHP 5.6 вы можете также объявить два массива в качестве класса констант вместо статических переменных):

class RemoteAddress { 

    private $ip; 
    private $id; 

    private static $partners_ips = [ 
      '192.168.56.1' => 0, 
      '192.168.58.4' => 2, 
      '192.168.59.2' => 3 ]; 

    private static $partners_subnets = [ // note that subnets must end with a dot 
      '192.168.57.' => 1, 
      '192.168.60.' => 4, 
      '192.168.61.' => 5 ]; 

    public function __construct($ip) { 
     if (filter_var($ip, FILTER_VALIDATE_IP) === false) 
      throw new Exception("invalid IP address"); 

     $this->ip = $ip; 
     $this->id = $this->searchID(); 
    } 

    public function getIDPartner() { 
     return $this->id; 
    } 

    private function searchID() { 
     if (array_key_exists($this->ip, self::$partners_ips)) 
      return self::$partners_ips[$this->ip]; 

     foreach (self::$partners_subnets as $subnet => $id) { 
      if (strpos($this->ip, $subnet) === 0) 
       return $id; 
     } 

     return false; 
    } 
} 

Вы можете использовать его как это:

try { 
    if (isset($_SERVER['REMOTE_ADDR'])) { 
     $remAddr = new RemoteAddress($_SERVER['REMOTE_ADDR']); 
     var_dump($remAddr->getIDPartner()); 
    } else throw new Exception('$_SERVER[\'REMOTE_ADDR\'] is not defined'); 
} catch(Exception $e) { 
    echo $e->getMessage(); 
} 
Смежные вопросы