2011-01-28 7 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 
     ] 
    )) 
));