- ベストアンサー
再帰的な処理を使って配列サニタイズする方法
- 引数が配列の場合に再帰的に処理する方法についてご質問いただいています。現在のコードでは、array_map()関数を使用して配列をサニタイズしようとしていますが、エラーが発生しています。サニタイズ処理を再帰的に行うためには、コールバック関数名を正しく指定する必要があります。
- サニタイズ処理を再帰的に行うために指定するコールバック関数名は、'sanitize'ではなく、'Valid::sanitize'とする必要があります。これにより、クラスのメソッドとして正しく処理が行われます。
- また、コードの中で$validというインスタンスを作成していますが、このインスタンスを使用する必要はありません。sanitizeメソッドは静的メソッドで、インスタンス化せずに直接使用することができます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
オブジェクト内のメソッドを動的に指定するcallableは array($this, 'sanitize') です。 また、クラス内のメソッドを静的に指定するcallableは array(__CLASS__, 'sanitize') です。PHP5.3以降では 'Valid::sanitize' のように書くことも出来ます。 なお、配列再帰処理でしたらarray_walk_recursiveを使うのが一番速いですよ。 http://php.net/manual/ja/function.array-walk-recursive.php (5.3以降のみのクロージャを使用しています) class Valid { ____ ____public static function sanitize($input) { ________if (is_array($input)) { ____________array_walk_recursive($input, function(&$v) { ________________$v = str_replace("\0", '', $v); ____________}); ________} else { ____________$input = str_replace("\0", '', $input); ________} ________return $input; ____} ____ } (この指摘をすると質問の前提条件自体が崩れると思いますが) そもそもNULLバイトを削除したところで安全対策になるかどうかというと疑問です。 現在のPHPの多くの関数はバイナリセーフなのでNULLバイトを含んでいても正しく処理できます。 それよりもUTF-8エンコーディングバリデーションの方が必要な気がします。 私はこんな感じで、リクエストを処理する部分にエンコーディングバリデーションも組み込んでいますね。 http://qiita.com/mpyw/items/c39b9ee695a5c2e74627 【preg_match関数でパターンにu修飾子をつけたとき】 不正エンコーディングが見つかった際、返り値は必ずFALSEになります 【preg_replace関数でパターンにu修飾子をつけたとき】 不正エンコーディングが見つかった際、返り値は必ずNULLになります
その他の回答 (1)
- notnot
- ベストアンサー率47% (4900/10359)
sanitizeは普通の関数じゃなくて、メソッドなので、オブジェクトに対して -> 経由での呼び出ししか出来ません。つまり、array_map の引数に渡せません。 Validというクラスで何をしたいのかいまいちわかりません。クラスとオブジェクトについて、よく理解されてないのではないかと思います。 とりあえず動くようにすると、 $valid = new Valid(); $array = array( "ああ\0あ","いいい","ううう", ); debug_zval_dump($array); $array = $valid->sanitize( $array ); debug_zval_dump($array); class Valid{ public function sanitize($str){ return Valid::sanitizesub($str); } public static function sanitizesub( $str ){ if ( is_array( $str ) ) return array_map( "Valid::sanitizesub", $str ); return str_replace( "\0", '', $str ); } }
お礼
わかりやすい回答をありがとうございました。 5.2のサーバーなので以下のようにして動作させることができました。 if ( is_array( $value ) ) return array_map( array( $this, 'sanitize' ), $value ); NULLバイト削除以下は略しましたが文字コードの設定やスペースの削除など一通りの処理を行っています。 qiitaのソースも是非参考にさせていただきます!