用PHPfilter_input_array过滤多维POST

Filtering multi-dimensional POST with PHP filter_input_array

有没有办法用 PHP 的 filter_input_array filter/sanitize 多维 POST 数据?

给定一个导致以下 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,但没办法说出它需要检查哪一层。

维度较小的工作示例:

如果只是嵌套较少的一组数据,那就很简单了:

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

可以过滤:

$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);

但是嵌套数据多了怎么解决呢?有没有 splitting/flattening POST 数据的方法?

/**
* 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);
}