質問: php にて、HTMLをエスケープ処理する関数として下記のようなものがありました。 ``` function h($var) { if ( is_array($var) ) { return array_map( 'h', $var ); } else { return htmlspecialchars( $var, ENT_QUOTES, 'UTF-8' ); } } ``` 毎度、「htmlspecialchars( $var, ENT_QUOTES, 'UTF-8' )」を記述することが短縮できるということは理解できるのですが、その前の部分の ``` if ( is_array($var) ) { return array_map( 'h', $var ); } ``` は何をしているのでしょうか。$varが配列だった場合には、、、???よくわかりませんので教えていただけますと幸いです。 よろしくお願いいたします。
回答: はい、array_map()関数を使っていますね。 $varが配列だった場合、配列内の要素を1つずつ取り出して、function h ()を実行させてから$var配列に戻して、全部終わったらそれをreturnする。 こういったことをやっています。 array_map関数は、第2引数で指定された配列の全要素に対して、第1引数に指定された関数を1個ずつ実行させるという機能があります。「コールバック関数」と、公式ドキュメントでは呼んでいますね。 http://php.net/manual/ja/function.array-map.php ``` return array_map( 'h', $var ); ``` 第一引数に指定する関数ですが、'h'と、一見ただの文字データに見えますが、これは関数名を表しています。 今回の場合だと、function h 関数ですね。 $varが配列だった場合、要素を1個取り出してそれを引数にしてh関数を実行させます。 そうすると、取り出した値が文字列だったら、そのままhtmlspecialcharasが実行されて値が返ってきますね。 仮に、取り出した要素がさらに配列だった場合でも、array_map()によってさらにその要素が取得されて・・・といった感じでどんどんループしていきます。 こうすることによって、f()関数はたとえ引数に文字列ではなく配列を渡した場合でも、その全ての値をHTMLエスケープすることが可能になっているということです。 配列の要素1つ1つを、foreachなどで展開させてからエスケープするのは手間ですから、大分省略できますね。