[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
 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の結果
 1// フィルタ前
 2Array
 3 (
 4     [0] => apple
 5     [1] => banana
 6     [2] => orange
 7 )
 8// フィルタ後
 9 Array
10 (
11     [0] => apple
12 )

$fruitsappleだけをフィルタした結果を確認することができました。

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 コードを開く
サンプル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の結果 を開く
サンプル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の使い方は、最近知ったので勉強になりました。
ちょっとフィルタ条件が多い時に使えるかもしれないですね。

それでは、このへんで。
バイナリー!

\ ちょっとお買い物 /


関連した記事