6

これは一晩中私を夢中にさせてきました。基本的に、値をサニタイズした後、多次元配列に特定の値を設定する必要があります (おそらく、検証に依存します。検証に失敗した場合、値を空の文字列に設定する必要があります)。この投稿配列があるとしましょう:

$data['should']['be']['int'] = ' yjd';

で値をサニタイズした後filter_var( $value, FILTER_SANITIZE_NUMBER_INT );、空の文字列が返されます。次に、何らかの方法で値を$data['should']['be']['int']空の文字列に設定する必要があります。

この値は検証関数に渡されますが、空の文字列が整数ではないため失敗します。繰り返しになりますが、その検証済みの値を$data['should']['be']['int']空の文字列に設定する必要があります。

検証全体が開始される前に、関連するすべてのキーを配列に保存しているので、サニタイズまたは検証が必要になるまでに、次のようなものが利用可能になります。

$keys = array(
    0 => 'should',
    1 => 'be',
    2 => 'int'
);

$data次に、配列を参照して新しい値を設定することにより、 foreach ループで上記のキーを使用して配列にアクセスしようとしましたが、何を試してもアクセス&$dataできませんでした。上記は単純化した例です。$data全体が検証クラスの一部であるため、渡された配列の正確な深さはわかりません。

どんなポインタでも大歓迎です!ご協力いただきありがとうございます!

編集: 投稿を編集できないと思っていましたが、インターネット接続だけになってしまいました. 以下の私のコメントは無視してください。とにかく、再帰的に呼び出してみたメソッドは次のとおりです。

protected function set_value( &$data, $value ) {
    foreach( $data as &$val ) {
        if( is_array( $val ) ) {
            $this->set_value( $val, $value );
        } else {
            $val = $value;
        }
    }
}

ループを開始するには、次のようにしました。

$this->set_value( $data[$keys[0]], $value );
4

2 に答える 2

14

あなたが試すことができます

$data = array();
$keys = array(
        0 => 'should',
        1 => 'be',
        2 => 'int'
);

$value = 'yjd';



echo "<pre>";
setValue($data,$keys,$value);
print_r($data);

出力

Array
(
    [should] => Array
        (
            [be] => Array
                (
                    [int] => yjd
                )

        )

)

使用する機能

function setValue(&$data, $path, $value) {
    $temp = &$data;
    foreach ( $path as $key ) {
        $temp = &$temp[$key];
    }
    $temp = $value;
    return $value ;
}
于 2013-03-18T18:15:30.100 に答える
2

あなたはouzoグッズでそれを行うことができます:

Arrays::setNestedValue($array, array('should', 'be', 'int'), 'value');

http://ouzo.readthedocs.org/en/latest/utils/arrays.html#setnestedvalueを参照してください。

于 2015-01-09T14:42:38.580 に答える