2011-01-28 3 views
2

Любые идеи, почему это не работает?filter_var_array() многомерный массив

$_POST = array('edit' => array('name' => 'test')); 

die(var_dump(
    filter_var_array($_POST, array(
     'edit["name"]' => FILTER_SANITIZE_STRING, 
     'edit[name]' => FILTER_SANITIZE_STRING, 
    )), 
    $_POST 
)); 

Как я могу дезинфицировать/фильтровать параметр POST, требуя, чтобы это был массив?

+0

Поскольку 'filter_var_array()' не работает рекурсивно? – BoltClock

+0

Это для чисел (целые числа, парные и т. Д.), Но я не думаю, что это происходит со строками. Это просто дает мне ложь при попытке дезинформировать массив строк. – xil3

ответ

1

Не знал, что filter_var_array() не поддерживает рекурсию. Не вижу причин, почему это не должно быть. Вот простое решение:

// 28 01 2010, Gajus Kuizinas 
function hp_path_to_array($keys, $value, $data = array()) 
{ 
    if(empty($keys)) 
    { 
     return $value; 
    } 

    $key  = array_shift($keys); 

    $data[$key] = hp_path_to_array($keys, $value, $data); 


    return $data; 
} 

function hp_filter_var_array($data, $rules) 
{ 
    $return = array(); 

    foreach($rules as $k => $options) 
    { 
     $path = explode('[', str_replace(']', '', $k)); 

     if(empty($path)) 
     { 
      continue; 
     } 

     if(!is_array($options)) 
     { 
      $filter  = $options; 
      $options = array(); 
     } 
     else 
     { 
      $filter  = $options['filter']; 

      unset($options['filter']); 
     } 

     $value   = $data; 

     foreach($path as $key) 
     { 
      if(isset($value[$key])) 
      { 
       $value = $value[$key]; 
      } 
      else 
      { 
       $value = NULL; 
       break; 
      } 
     } 

     $return += hp_path_to_array($path, filter_var($value, $filter, $options)); 

     unset($rules[$k]); 
    } 

    $return += filter_var_array($data, $rules); 

    return $return; 
} 
2

Обрезка и дезинфицировать вложенные массивы

$array = $_POST; 

array_walk_recursive($array, function (&$v) { 
    $v = filter_var(trim($v), FILTER_SANITIZE_STRING); 
}); 

$prepared = $array; 
0

Существует флаг фильтр, который делает только это: он гарантирует, что ваш параметр $_POST['edit'] является массивом, и фильтры/санирует элементы массива, а не сам параметр.

$_POST = array('edit' => array('name' => 'test')); 

die(var_dump(
    filter_var_array($_POST, array(
     'edit' => [ 
      'filter' => FILTER_SANITIZE_STRING, 
      'flag' => FILTER_REQUIRE_ARRAY 
     ] 
    )) 
)); 
Смежные вопросы