2

私は$_POSTデータをフィルタリングし、後でそれを HTML としてレンダリングしようとしています。これはネストされた配列であり、約 3 レベルの深さになります。私の構造は次のようになります。

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_arrays (配列とサニタイズ引数を使用) を使用する方法があると直感的に感じていますが、私は PHP にかなり慣れていないため、苦労しています。他の配列を正常にフィルタリングしましたが、配列を反復処理してフィルタリングし、同じ構造のオブジェクトを返す適切な方法があるかどうか疑問に思っています。

4

3 に答える 3

2

これにより、データが再帰的にフィルター処理され、要求どおりにオブジェクトが返されます。サニタイズ関数でフィルター メソッドを選択します。この関数を使用すると、いくつかのレベルを深くすることができ、非対称構造を持つことができます。

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

        )

)
于 2012-08-10T13:58:07.273 に答える
0

ここで、入力を検証したい2つのことがわかります。

  1. 構造-たとえば、タイトルや著者がいない場合、本は完全ではありません。
  2. 各フィールドのデータ-たとえば、本のタイトルには、最初と最後に空白がほとんど含まれていません。

これは少し単純すぎるかもしれませんが、私が強調したいのは、これらのデータ型の理解を検証に入れる必要があるということです。

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
}

データ構造が複雑であるように、検証も複雑です。本や記事などのさまざまな複雑なデータ型がある場合でも、これらの種類の入力をサポートする一般的な関数を自分で作成して、重複したコードを独自の関数に移動し、後で重複を削除することができます。

次に、 :filter_input_arrayを使用して、関数で特定のフィルターを使用できます。FILTER_CALLBACK

$args = array(
    'books'    => array('filter'  => FILTER_CALLBACK,
                        'options' => 'books_is_valid', 
                       ),
    'articles' => array('filter'  => FILTER_CALLBACK,
                        'options' => 'articles_is_valid', 
                       ),
);

$myinputs = filter_input_array(INPUT_POST, $args);

var_dump($myinputs);

これは検証のみであることに注意してください。したがって、フォーム送信の合計が有効であったかどうかがわかります。

于 2012-08-10T13:38:21.230 に答える
0

url を参照してください:--多次元配列のフィルター処理

array_filter は、フィルタリング ロジックをカスタマイズするために使用できるコールバックを受け入れます。これはうまくいきます:

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

ここで、コールバックは無名関数として提供されます。

于 2012-08-10T13:42:42.150 に答える