Php 筛选嵌套数组

Php 筛选嵌套数组,php,arrays,parsing,filtering,Php,Arrays,Parsing,Filtering,我试图过滤$\u POST数据,然后将其呈现为HTML,即嵌套数组,深度约为三层。我的结构如下所示: Array ( [books] ==> Array ( [book1] ==> Array ( [0] ==> Title [1] ==> Author ) [book2] ==> Array

我试图过滤
$\u POST
数据,然后将其呈现为HTML,即嵌套数组,深度约为三层。我的结构如下所示:

Array
(
    [books] ==> Array
    (
        [book1] ==> Array
        (
            [0] ==> Title
            [1] ==> Author                    
        )
        [book2] ==> Array
        (
            [0] ==> Title
            [1] ==> Author
        )
    )

    [articles] ==> Array
    (
        [article1] ==> Array
        (
            [0] ==> Journal
            [1] ==> Title                    
        )
        [article2] ==> Array
        (
            [0] ==> Journal
            [1] ==> Title
        )
    )
)

我有一种直觉,认为有一种方法可以使用foreach循环和filter_input_数组(使用数组和sanitize参数),但我对PHP非常陌生,很难做到这一点。我已经成功地过滤了其他数组,但我想知道是否有一种优雅的方法可以遍历数组,过滤它们,并返回具有相同结构的对象。

我在这里看到两件事,您希望验证输入:

  • 结构——例如,如果一本书没有书名或没有作者,它就是不完整的
  • 每个字段都包含数据——例如,书名的开头和结尾都不包含空格
  • 也许这有点过于简化,但我想强调的是,您需要将对这些数据类型的理解纳入验证中:

    function books_is_valid(array $books) {
         foreach ($books as $book) {
             if (!$book_is_valid($bool) {
                 return false;
             }
         }
         return true;
    }
    
    function book_is_valid(array $book) {
        if (!count($book) === 2) return false;
        if (!array_keys($book) === array(0, 1)) return false;
        if (!book_title_is_valid($book[0])) return false;
        if (!book_author_is_valid($book[1])) return false;
        return true;
    }
    
    book_title_is_valid($title) {
         ... # do your checks, return bool
    }
    
    book_author_is_valid($author) {
         ... # do your checks, return bool
    }
    
    数据结构复杂,验证也复杂。由于您甚至有不同的复杂数据类型,如book和article,您可以编写一些通用函数来支持这些类型的输入,这样您就可以将重复的代码移动到自己的函数中,并在以后删除重复的代码

    然后,您可以使用
    filter\u input\u array
    功能使用特定的过滤器,方法是:

    请注意,这只是验证。因此,它将告诉您表单提交总数是否有效。

    请参阅url:--

    array_filter接受一个回调,您可以使用该回调自定义过滤逻辑。这将有助于:

    $filtered = array_filter($array, function($el) { return !empty($el['mob']; });
    

    在这里,回调是作为匿名函数提供的。

    这将递归筛选数据并根据请求返回对象,请在sanitize函数中选择筛选方法。使用此函数可以深入到多个层次,并且具有不对称结构

    $arrayData = array (
        'books' => array ( array ( 'Title1','Author1' ), array ( 'Title2','Author2' )),
        'articles' => array ( array ( 'Journal3','Title3' ), array ( 'Journal3','Title3' ))
    
    );
    
    function arrayFilter($arrayIn){
        $output = null;
        if (is_array($arrayIn)){
            foreach ($arrayIn as $key=>$val){
                if (is_array($val)){
                    $output->{$key} = arrayFilter($val);
                } else {
                    $output->{$key} = sanitize($val);
                }
            }
        } else {
            $output->{$key} = sanitize($val);
        }
        return $output;
    }
    
    function sanitize($val)
    {
        //insert your preferred data filter here
        return addslashes('filtered: '.$val);
    }
    
    print_r (arrayFilter($arrayData));
    
    输出:

    stdClass Object
    (
        [books] => stdClass Object
            (
                [0] => stdClass Object
                    (
                        [0] => filtered: Title1
                        [1] => filtered: Author1
                    )
    
                [1] => stdClass Object
                    (
                        [0] => filtered: Title2
                        [1] => filtered: Author2
                    )
    
            )
    
        [articles] => stdClass Object
            (
                [0] => stdClass Object
                    (
                        [0] => filtered: Journal3
                        [1] => filtered: Title3
                    )
    
                [1] => stdClass Object
                    (
                        [0] => filtered: Journal3
                        [1] => filtered: Title3
                    )
    
            )
    
    )
    

    需要什么样的结果数组?基本上相同的结构:[items]->array([books]->array([book1],[book2]),[articles]->array([article1],[article2])。我可以看到做了一系列foreach循环,但我认为可能有一个函数,或者函数的组合,可以做到这一点。可能是过滤、输入、数组、循环等等。好的,你想确保标题、作者等没有特殊字符吗?这太完美了,谢谢。我很高兴能更多地熟悉PHP中的stdClass对象。这不起作用,因为您甚至从原始源代码复制了键入错误。
    stdClass Object
    (
        [books] => stdClass Object
            (
                [0] => stdClass Object
                    (
                        [0] => filtered: Title1
                        [1] => filtered: Author1
                    )
    
                [1] => stdClass Object
                    (
                        [0] => filtered: Title2
                        [1] => filtered: Author2
                    )
    
            )
    
        [articles] => stdClass Object
            (
                [0] => stdClass Object
                    (
                        [0] => filtered: Journal3
                        [1] => filtered: Title3
                    )
    
                [1] => stdClass Object
                    (
                        [0] => filtered: Journal3
                        [1] => filtered: Title3
                    )
    
            )
    
    )