2016-03-09 3 views
0

У меня есть два массива с почти той же структурой.Найти значение массива с помощью ключей из другого массива

Первый массив - это данные $_POST, а второй содержит правила регулярных выражений и некоторые другие вещи для проверки данных.

Пример:

$data = array(
    'name' => 'John Doe', 
    'address' => array(
     'city' => 'Somewhere far beyond' 
    ) 
); 

$structure = array(
    'address' => array(
     'city' => array(
      'regex' => 'someregex' 
     ) 
    ) 
); 

Теперь я хочу, чтобы проверить

$data['address']['city'] with $structure['address']['city']['regex'] 

или

$data['foo']['bar']['baz']['xyz'] with $structure['foo']['bar']['baz']['xyz']['regex'] 

Любые идеи, как добиться этого с помощью функции PHP?


Редактировать: Кажется, я нашел решение самостоятельно.

$data = array(
    'name' => 'John Doe', 
    'address' => array(
     'city' => 'Somewhere far beyond' 
    ), 
    'mail' => '[email protected]' 
); 

$structure = array(
    'address' => array(
     'city' => array(
      'regex' => 'some_city_regex1', 
     ) 
    ), 
    'mail' => array(
     'regex' => 'some_mail_regex1', 
    ) 
); 

function getRegex($data, $structure) 
{ 
    $return = false; 

    foreach ($data as $key => $value) { 

     if (empty($structure[$key])) { 
      continue; 
     } 

     if (is_array($value) && is_array($structure[$key])) { 
      getRegex($value, $structure[$key]); 
     } 
     else { 
      if (! empty($structure[$key]['regex'])) { 
       echo sprintf('Key "%s" with value "%s" will be checked with regex "%s"', $key, $value, $structure[$key]['regex']) . '<br>'; 
      } 
     } 
    } 

    return $return; 
} 

getRegex($data, $structure); 
+0

Одно слово: рекурсия – Barmar

+0

Да. Я пытаюсь и стараюсь и чувствую себя все глупо. :/ – TeK

+0

Опубликуйте то, что вы пробовали, чтобы мы могли показать, где вы поступили неправильно. Мы не собираемся писать все для вас. – Barmar

ответ

0

Учитывая эти массивы:

$data = array(
    'name' => 'John Doe', 
    'address' => array(
     'city' => 'Somewhere far beyond' 
    ), 
    'foo' => array(
     'bar' => array(
      'baz' => array(
       'xyz' => 'hij' 
      ) 
     ) 
    ) 
); 

$structure = array(
    'address' => array(
     'city' => array(
      'regex' => '[a-Z]' 
     ) 
    ), 
    'foo' => array(
     'bar' => array(
      'baz' => array(
       'xyz' => array(
        'regex' => '[0-9]+' 
       ) 
      ) 
     ) 
    ) 
); 

и эта функция:

function validate ($data, $structure, &$validated) { 
    if (is_array($data)) { 
     foreach ($data as $key => &$value) { 
      if (
       array_key_exists($key, $structure) 
       and is_array($structure[$key]) 
      ) {    
       if (array_key_exists('regex', $structure[$key])) { 
        if (!preg_match($structure[$key]['regex'])) { 
         $validated = false; 
        } 
       } 

       validate($value, $structure[$key], $validated); 
      } 
     } 
    } 
} 

вы можете проверить массивы друг против друга и получить результат проверки следующим образом:

$validated = true; 

validate($data, $structure, $validated); 

if ($validated) { 
    echo 'everything validates!'; 
} 
else { 
    echo 'validation error'; 
} 

А, вы нашли решение. Очень хорошо.

Смежные вопросы