2015-09-10 33 views
1

有沒有一種方法可以用PHP的filter_input_array過濾/清理多維POST數據?用PHP過濾多維POST filter_input_array

鑑於這將導致以下POST數據的表單:

$_POST[ 
    'level1a' => [ 
     'level2a' => [ 
      'key1' => 'value1', 
      'key2' => 'value2' 
     ], 
     'level2b' => [ 
      'key1' => 'value1', 
      'key2' => 'value2' 
     ] 
    ], 
    'level1b' => [ 
     'level2a' => [ 
      'key1' => 'value1', 
      'key2' => 'value2' 
     ], 
     'level2b' => [ 
      'key1' => 'value1', 
      'key2' => 'value2' 
     ] 
    ] 
] 

我沒有看到一個方法來告訴filter_input_array功能檢查數據的嵌套更深一層。似乎只有國旗FILTER_REQUIRE_ARRAY,但沒辦法告訴它需要檢查哪個級別。

工作實例較少尺寸:

如果這只是一個不太嵌套組數據,這將是非常簡單的:

$args = array(
    'level1a' => array(
     'filter' => FILTER_SANITIZE_STRING, 
     'flags' => FILTER_REQUIRE_ARRAY 
    ), 
    'level1b' => array(
     'filter' => FILTER_SANITIZE_STRING, 
     'flags' => FILTER_REQUIRE_ARRAY 
    ) 
); 
$form_data = filter_input_array(INPUT_POST, $args); 

$_POST[ 
    'level1a' => [ 
     'level2a' => 'value1', 
     'level2b' => 'value2' 
    ], 
    'level1b' => [ 
     'level2a' => 'value1', 
     'level2b' => 'value2' 
    ] 
] 

可以用過濾

但如何解決更多的嵌套數據呢?有沒有拆分/展平POST數據的方法?

+1

您可能很容易編寫一個遞歸函數來對某些數據運行'filter_input_array',然後遞歸到內部數組。 – shevron

+0

我現在正在處理類似的問題。我會讓你知道我想出了什麼。 –

+0

我可能會嘗試工程我的HTML表單,以便它只創建標量和/或二維數組。由於'$ _POST'和'INPUT_POST'不一樣,扁平'$ _POST'對'INPUT_POST'沒有任何影響。從純粹的意義上說,我認爲你會想''_POST'離開它。我的建議是,如果可能的話,你會將你的HTML表格變平,而不是輸入源數組。是的,欺騙可以完成,但費用是多少?處理時間?保養?文檔?一旦你超越了兩個維度,PHP會將你留給自己的設備。 :)注意,沒有INPUT_FILES。 –

回答

1
/** 
* Trim and filter every value in the nested array 
*/ 
function filter(array &$array) 
{ 
    array_walk_recursive($array, function (&$value) { 
     $value = filter_var(trim($value), FILTER_SANITIZE_STRING); 
    }); 

    return $array; 
} 

/** 
* Get filtered POST data 
*/ 
function post(){ 
    return filter($_POST); 
}