配列の要素をフィルタリングする(array_filter, array_reduce)
次のような連想配列からvalue
が偶数の要素のみを取り出します。
index.php
$array = [
[ 'number' => 1 ],
[ 'number' => 2 ],
[ 'number' => 3 ],
[ 'number' => 4 ],
[ 'number' => 5 ],
[ 'number' => 6 ],
[ 'number' => 7 ],
];
こちらを一旦var_dump()
しておきます。
index.php
array(7) {
[0]=>
array(1) {
["number"]=>
int(1)
}
[1]=>
array(1) {
["number"]=>
int(2)
}
[2]=>
array(1) {
["number"]=>
int(3)
}
[3]=>
array(1) {
["number"]=>
int(4)
}
[4]=>
array(1) {
["number"]=>
int(5)
}
[5]=>
array(1) {
["number"]=>
int(6)
}
[6]=>
array(1) {
["number"]=>
int(7)
}
}
このような構造の配列になっております(添字に注目)
まずはarray_filter()
を使ってvalue
が偶数の物を取り出していきましょう。
array_filter()
index.php
$array_even = array_filter($array, function ($int) {
return $int['number'] % 2 === 0;
});
こちらをvar_dump()
してみます。
index.php
array(3) {
[1]=>
array(1) {
["number"]=>
int(2)
}
[3]=>
array(1) {
["number"]=>
int(4)
}
[5]=>
array(1) {
["number"]=>
int(6)
}
}
うまく取り出せました。
添字を見てみると、$array
の添字がそのまま使われています。
こちらがarray_filter()
の挙動です。
続いてarray_reduce()
を使って同様の処理を行っていきます。
array_reduce()
index.php
$array_even = array_reduce($array, function ($number, $int) {
if ($int['number'] % 2 === 0) {
$number[] = $int;
}
return $number;
});
こちらをvar_dump()
してみると
index.php
array(3) {
[0]=>
array(1) {
["number"]=>
int(2)
}
[1]=>
array(1) {
["number"]=>
int(4)
}
[2]=>
array(1) {
["number"]=>
int(6)
}
}
array_filter()
と同様にvalue
に偶数を持つ要素を取り出すことができました。
添字を見てみると、添字がリセットされ0-based
な配列になっています。
単に配列をフィルタリングする際には、array_filter()
を、添字も使用する処理ならばarray_reduce()
を使用すると良いでしょう。
追記:array_filter()
してarray_values()
してもo-based
な配列にすることができます。
以上が配列をフィルタリングする際のarray_filter()
とarray_reduce()
の挙動の違いでした。
ご閲覧ありがとうございました。