配列をコールバック関数で処理

array_filter()

array_filter()の構文は「array_filter(対象配列 [, コールバック関数, [フラグ]]);」です。
array_filter()はコールバック関数がtrueを返した時、対象配列の現在のキーと値を含む配列を返します。
コールバック関数の引数には(値, キー)の形式を使います。
フラグには、値ではなくキーをコールバック関数に渡す「ARRAY_FILTER_USE_KEY」、値とキーの両方をコールバック関数に渡す「ARRAY_FILTER_USE_BOTH」があります。
コールバック関数を省略すると対象配列の中でfalseと等しいものが全部取り除かれます。falseには、integerの0、floatの0.0、要素の数が無い配列、空文字、NULLもしくは値がない変数などが該当します。

PHP
1
2
3
4
5
6
<?php
$a = array("G" => "70","B" => "20","A" => "10");
print_r(array_filter($a, function($val, $key){
return $key == 'B' || $val == 20;
}, ARRAY_FILTER_USE_BOTH));
?>
実行結果:
Array
(
[B] => 20
)

array_map()

array_map()の構文は「array_map(コールバック関数, 配列1, [配列2・・・]);」です。
array_map()はコールバック関数と第二引数以降の配列の値を使って任意の処理をします。また、コールバック関数に渡す引数の数と第二引数以降の配列の数は一致させなければなりません。
コールバック関数の引数には(値1, 値2, ・・・)の形式を使います。

PHP
1
2
3
4
5
<?php
$a = array(1,2,3);
$b = array(2,3,4);
print_r(array_map(function ($a,$b){return $a*$b;}, $a, $b));
?>
実行結果:Array
(
[0] => 2
[1] => 6
[2] => 12
)

array_reduce()

array_reduce()の構文は「array_reduce(対象配列, コールバック関数 [, 初期値])」です。
array_reduce()はコールバック関数で反復処理された結果を返します。
コールバック関数の引数は、(前の要素の処理結果, 現在の反復処理の値)といった形にします。
オプションの第四引数には、最初にコールバック関数へ渡す初期値を入れます。また、配列が空であればこの初期値が最終の結果として使われます。

PHP
1
2
3
4
5
<?php
$a = array(2,3,4);
print_r(array_reduce($a, function ($end, $val){return $end+=$val;}, 0));
print_r(array_reduce($a, function ($end, $val){return $end.=$val;}, '。文字列として連結:'));
?>
実行結果:9。文字列として連結:234

array_walk()とarray_walk_recursive()

array_walk()の構文は「array_walk(&対象配列, コールバック関数 [, ユーザーデータ]);」です。
array_walk()は、配列内にある要素の全てをユーザ定義関数に適用させます。また、要素のキーと値を一つずつコールバック関数に渡します。ポインタの位置に関係なく配列全てに渡って、ユーザ定義関数が適用されます。オプションの第三引数にユーザデータが指定された場合は、コールバック関数への三番目の引数として渡されます。返り値は成功すればtrue、失敗すればfalseを返します。

array_walk_recursive()の構文は「array_walk_recursive(&対象配列, コールバック関数 [, ユーザーデータ]);」です。
array_walk_recursive()は、array_walk()とほとんど変わりませんが、配列の要素を全て再帰的にユーザ定義関数にて適用します。また、array_walk()、array_walk_recursive()共に参照渡しが可能で、その場合対象配列の前にアンパサンド「&」を追記します。配列を参照渡しすると元の配列にそのまま書き込まれるため、ユーザ定義関数での変更処理が可能になります。

PHP
1
2
3
4
<?php
$a=array(1,2,3);
array_walk($a, function ($b){echo ($b+1).'。';});
?>
実行結果:2。3。4。