[PHP] array_filter関数を使ってサンプルを作ってみる

Nプログラマ(@Nprog128)です。
今回は、PHPのarray_filter関数を使ってサンプルを作ってみました。
array_filter関数とは?
配列に入っている要素をフィルタリングする関数です。 フィルタリングする方法はコールバック関数で指定します。
例えば、1から10が入っている配列から、偶数だけ取り除いた奇数だけの新しい配列を取得できたりします。
新しい配列を生成して返すので、元の配列には影響がありません。
マニュアルを見てみる
1array_filter(array $array [, callable $callback [, int $flag = 0 ]]) : array
v5.6.0からflagを指定することができるようになりました。
これを使うと、コールバックの引数の受け取り方を指定することができます。
サンプルでも作って試しています。
サンプル1: リンゴだけを取り出す
フルーツの情報が入った配列から、リンゴだけを取り出すサンプルを作ってみます。
コード
サンプル1 コードを開く
1<?php
2
3// 引数がappleならtrueを返す
4function is_apple($fruit)
5{
6 return ($fruit == 'apple');
7}
8
9$fruits = ['apple', 'banana', 'orange'];
10$result = array_filter($fruits, 'is_apple');
11
12// フィルタする前
13print_r($fruits);
14// フィルタした後
15print_r($result);
結果
サンプル1の結果 を開く
1// フィルタ前
2Array
3 (
4 [0] => apple
5 [1] => banana
6 [2] => orange
7 )
8// フィルタ後
9 Array
10 (
11 [0] => apple
12 )
$fruitsのappleだけをフィルタした結果を確認することができました。
is_apple関数を定義せず、無名関数を渡しても同じ結果が得られます。
サンプル2: コールバック関数の引数に、配列のvalueとkeyを受け取るようにしてみる
先程のサンプルでは、コールバック関数の引数が配列のvalueだけでした。
array_filterの第三引数のflagを使えば、配列のvalueとkeyの両方を渡すことができたりします。
表にするとこんな感じです。
第三引数の指定 | どうなるか? |
---|---|
なし | 配列のvalueをコールバックの引数に渡す |
ARRAY_FILTER_USE_KEY | 配列のkeyをコールバックの引数に渡す |
ARRAY_FILTER_USE_BOTH | 配列のvalueとkeyをコールバックの引数に渡す |
連想配列で特定のkey名や、valueでフィルタしたいという時に使えそうです。
flagでARRAY_FILTER_USE_BOTHを指定した時、コールバックが受け付ける引数の順序はvalue、keyの順序であることに注意です。
(key, valueではありません)
これを使って、以下の条件で配列をフィルタリングをするサンプルを作ってみます。
- key名がfirst_personを除外
- valueのageが40なら除外
コード
サンプル2 コードを開く
1<?php
2
3// array_filterに渡すコールバック関数
4function person_filter($value, $key)
5{
6 // key名がfirst_personを除外
7 if ($key == 'first_person') {
8 return false;
9 }
10
11 // ageが40を除外
12 if ($value['age'] == 40) {
13 return false;
14 }
15
16 // それ以外は除外しない
17 return true;
18}
19
20// personが入った配列
21$persons = [
22 // さいしょの人
23 'first_person' => [
24 'name' => 'さいしょの人の名前',
25 'age' => 20,
26 'job' => '戦士'
27 ],
28 // にばんめの人
29 'second_person' => [
30 'name' => 'にばんめの人の名前',
31 'age' => 30,
32 'job' => '魔法使い'
33 ],
34 // さいごの人
35 'last_person' => [
36 'name' => 'さいごの人の名前',
37 'age' => 40,
38 'job' => '僧侶'
39 ]
40];
41
42// フィルタリング (第三引数で、ARRAY_FILTER_USE_BOTHを指定)
43$result = array_filter($persons, 'person_filter', ARRAY_FILTER_USE_BOTH);
44print_r($persons); // フィルタ前
45print_r($result); // フィルタ後
結果
サンプル2の結果 を開く
1Array
2(
3 [first_person] => Array
4 (
5 [name] => さいしょの人の名前
6 [age] => 20
7 [job] => 戦士
8 )
9
10 [second_person] => Array
11 (
12 [name] => にばんめの人の名前
13 [age] => 30
14 [job] => 魔法使い
15 )
16
17 [last_person] => Array
18 (
19 [name] => さいごの人の名前
20 [age] => 40
21 [job] => 僧侶
22 )
23
24)
25Array
26(
27 [second_person] => Array
28 (
29 [name] => にばんめの人の名前
30 [age] => 30
31 [job] => 魔法使い
32 )
33
34)
今回はにばんめの魔法使いがフィルタされるという結果になりました。
こんな感じでvalueとkeyをコールバックの引数に渡せることも覚えておくと役に立つかもしれないですね。
おわりに
今回は、array_filter関数のサンプルを作ってみるという内容でした。
第三引数のflagの使い方は、最近知ったので勉強になりました。
ちょっとフィルタ条件が多い時に使えるかもしれないですね。
それでは、このへんで。
バイナリー!