再帰的処理とは、一言でいうと自分自身を呼び出す関数です。
何が便利って連想配列全部に処理を行いたい場合などですかね。
連想配列に入ってきた文字列全てにhtmlspecialcharsを行う関数htmlspecialchars_arrayを作ってみましょう。
index.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//連想配列
$input=array(
'1'=>'abc',
'2'=>'<>',
'3'=>'#$%'
);
$output=htmlspecialchars_array($input);
var_dump($output);
//配列にhtmlspecialcharsする関数
function htmlspecialchars_array($array){
foreach($array as $key=>$val){
$ret[$key]=htmlspecialchars($val);
}
return $ret;
}
|
簡単にできました。
が、この関数、たとえば
$input=array(array('1'=>'abc'));
なんてものが入ってくるとあっさりエラーになってしまいます。
こういう場合に威力を発揮するのが再帰的処理です。
たとえばXMLは入れ子が凄いことになっているわけですが、再帰的処理を使わずにあれを解析しようとするととんでもない労力が必要になります。
とりあえずhtmlspecialchars_arrayをパワーアップさせてみましょう。
recursive.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
//連想配列
$input=array(
'1'=>'abc',
'2'=>'<>',
'3'=>array(
'01'=>'aaa',
'02'=>'><><'
)
);
$output=htmlspecialchars_array($input);
var_dump($output);
//配列にhtmlspecialcharsする関数
function htmlspecialchars_array($input){
if(is_array($input)){
foreach($input as $key=>$val){
$ret[$key]=htmlspecialchars_array($val);
}
return $ret;
}
$ret=htmlspecialchars($input);
return $ret;
}
|
関数htmlspecialchars_arrayでは、まず引数が配列かどうかチェックします。
配列であれば配列の中の各値についてさらにhtmlspecialchars_arrayを呼び出します。
引数が配列でなければ、htmlspecialcharsして返します。
これを繰り返した結果、$input内の全ての値に対してhtmlspecialcharsを適用することができます。
このように深さが何段階あるかわからないが、そういうものに対してチェックを行いたい場合に役立ちます。
ディレクトリを順にチェックしたり、XMLを解析したり。
あるいは迷路を解くようなプログラムも作れてしまうかもしれません。
まあPHPでそこまでやる意味はわかりませんが。
array_walk_recursive?
細かいことは気にするな。
ちなみにarray_walk_recursiveを使った場合はこうなります。
array_recursive.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//連想配列
$input=array(
'1'=>'abc',
'2'=>'<>',
'3'=>array(
'01'=>'aaa',
'02'=>'><><'
)
);
$output=htmlspecialchars_array($input);
var_dump($output);
function htmlspecialchars_array($input){
array_walk_recursive(
$input,
create_function('&$val, $key', '$val=htmlspecialchars($val);')
);
return $input;
}
|
create_functionわかりにくいよcreate_function。