array_walk_recursive
配列の全ての要素に、ユーザー関数を再帰的に適用する
PHP: array_walk_recursive - Manual
input
入力の配列
funcname
通常、 funcname は引数を二つとる。input パラメータの値が最初の引数、 キー/添字は二番目の引数となる。
注意:
funcname により配列の値そのものを変更する必要がある場合、 funcname の最初の引数は 参照 として渡す必要がある。(foreachと一緒です)
この場合、配列の要素に加えた変更は、 配列自体に対して行われる。
userdata
オプションの userdata パラメータが指定された場合、 コールバック関数 funcname への三番目の引数として渡される。
で、この関数を踏まえた上で、全ての要素にユーザ定義の関数を適用させると、こうなる。
<?php $str[] = "すまない,"; $str[] = "こっちに,"; $str[] = "こないでくれないか,"; function test_print(&$item) { $item = rtrim($item, ","); print_r($item . PHP_EOL); } array_walk_recursive($str, 'test_print'); ?>
すまない
こっちに
こないでくれないか
(サンプルには入れていませんが、第二引数には添字が入ります。)
でも、いちいち関数定義すんのって、なんか面倒ですね。そこでcreate_functionの出番となるわけなんDA
create_function
create_function — 匿名関数 (ラムダ形式) を作成する
指定したパラメータにより匿名関数を作成し、その関数のユニークな名前を返す。
string create_function ( string $args , string $code )
通常、argsには、シングルクオートで括った文字列を 指定し、code の場合も同様に指定することが推奨されるようです。
args
関数の引数。
code
関数のコード。
create_functionでラムダを作成して、それをarray_walk_recursiveの引数にすると、
関数定義のコードが要らなくなります。
<?php $str[] = "すまない,"; $str[] = "ホモ以外は,"; $str[] = "帰ってくれないか,"; array_walk_recursive($str, create_function('&$item, $key', '$item = rtrim($item, ","); print_r($item . PHP_EOL);')); ?>
すまない
ホモ以外は
帰ってくれないか
まあこんな感じです。
ちなみに
似たような関数にarray_walkがありますが、
PHP: array_walk - Manual
これはarray_walk_recursiveと違い再帰的に関数を適用しません。
つまり、こちらは多次元配列では使えないということですね。
例のスマホ配列を多次元にして、実行してみた。
array_walk_recursive
<?php $str[][] = "すまない,"; $str[] = "ホモ以外は,"; $str[][] = "帰ってくれないか,"; array_walk_recursive($str, create_function('&$item, $key', '$item = rtrim($item, ","); print_r($item . PHP_EOL);')); ?>
array_walk_recursiveは多次元配列でもOKですが、
すまない
ホモ以外は
帰ってくれないか
array_walk
<?php $str[][] = "すまない,"; $str[] = "ホモ以外は,"; $str[][] = "帰ってくれないか,"; array_walk($str, create_function('&$item, $key', '$item = rtrim($item, ","); print_r($item . PHP_EOL);')); ?>
array_walkはエラーになります。
PHP Warning: rtrim() expects parameter 1 to be string, array given in .....
ホモ以外は
PHP Warning: rtrim() expects parameter 1 to be string, array given in .....