読者です 読者をやめる 読者になる 読者になる

by shigemk2

当面は技術的なことしか書かない

配列の中身を操作する

PHP

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

PHP: create_function - Manual

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 .....