これはPHPのマニュアルを覗いたらわかる内容ではありますが、
is_array
array_map
結論から言うと、配列で渡されたものをすべてh関数を適用して戻す。
is_arrayで渡された変数が配列かどうか確認し、次のarray_mapに渡されています。
array_mapの仕様を確認すると、コールバック関数を"h"としています。
つまり、この質問のh関数自身ですね。
それにarray_mapの第2引数で$varの配列情報(is_arrayで配列と判断されたため)を渡しています。
これによりarray_map内部では、配列の要素は1つ1つ分解され、h関数を呼ぶようになっているわけです。
h関数を配列ではない変数を引数として呼び出されたものは、配列ではないので2つ目の処理htmlspecialchars側に処理が変わります。
したがって、配列だろうと、ただの変数だろうといずれにしてもhtmlspecialcharsを呼ぶようにする
という仕様のようですね。ちょっとは便利か。
追記 一応確認用のコードです:
php
1<?php
2
3function h( $var ) {
4 if ( is_array( $var ) ) {
5 return array_map( 'h', $var );
6 } else {
7 return htmlspecialchars( $var , ENT_QUOTES, 'utf-8' );
8 }
9}
10
11// --- 必要データ準備
12$arrayvar = array(
13 "1" => "<h>配列</h>",
14 "2" => "<input type='text' value='配列2'>配列2",
15 "3" => "<script language='javascript'>alert('test');</script>",
16 "4" => ""
17);
18
19$avar = "<b>test</b>";
20// -----------------------------------------------------
21
22// --- 確認
23echo "配列:" . "\n";
24var_dump( h( $arrayvar ) );
25
26echo "変数:" . "\n";
27var_dump( h( $avar ) );
28
29echo "ただの値:" . "\n";
30var_dump(h ( "<h1>test</h1>" ) );
31
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。