PHPのarray_filterの使い方: 配列を走査してフィルタリングする

43, 2020-09-11

目次

PHPのarray_filterの使い方

PHPには配列の要素をフィルタリングして新しい配列を作成する関数array_filterがあります。

array_filterは↓のように使います。

<?php

/**
 * 偶数のみを抽出するコールバック関数
 */
function is_even($x) {
    return $x % 2 == 0;
}

$arr = [1, 2, 3, 4];  // 配列
$result = array_filter($arr, 'is_even');  // コールバック関数を指定して実行

print_r($result);  // 結果を出力

?>

出力結果。

Array
(
    [1] => 2
    [3] => 4
)

PHPの対応バージョン

array_filterは以下のPHPのバージョンで対応しています。

  • PHP 4 >= 4.0.6

  • PHP 5

  • PHP 7

array_filterの構造

array_filterは↓のような構造を持っています。

array_filter(配列, コールバック関数, フラグ);

配列(第1引数)

第1引数の「配列」は処理対象の配列です。
array_filterはここに指定された配列を先頭から走査していきます。

コールバック関数(第2引数)

第2引数の「コールバック関数」には関数を指定します。
このコールバック関数は真偽値に相当するオブジェクトを返す必要があります。
このコールバック関数の返り値がTRUEとみなせればarray_filterは処理中の要素を結果の配列に保存し、FALSEとみなせれば処理中の要素を結果の配列から取り除きます。

コールバック関数が指定されなかった場合、array_filterFALSEと判断できる要素を結果の配列から取り除きます。

フラグ(第3引数)

第3引数のフラグは、コールバック関数に引数として何を渡すのか指定するためのフラグです。
フラグに使用できる定数は以下があります。

  • ARRAY_FILTER_USE_KEY

  • ARRAY_FILTER_USE_BOTH

ARRAY_FILTER_USE_KEYは、値ではなくキーだけをコールバック関数に渡します。
ARRAY_FILTER_USE_BOTHは、値だけではなく、値とキーの両方をコールバック関数に渡します。
第3引数のフラグを省略した場合は通常通り値のみがコールバック関数に渡されます。

返り値

array_filterの返り値は新しく作成されたフィルターを適用後の配列です。
フィルタリングでは要素のキーは保持されます

奇数の整数のみをフィルタリングする

整数の入った配列から奇数の整数のみを抜き出します。

<?php

/**
 * 奇数のみを抽出するコールバック関数
 */
function is_odd($x) {
    return $x % 2;
}

$arr = [1, 2, 3, 4];  // 配列
$result = array_filter($arr, 'is_odd');  // コールバック関数を指定して実行

print_r($result);  // 結果を出力

?>

出力結果。

Array
(
    [0] => 1
    [2] => 3
)

結果の配列のキーがそのままになっていることに注目してください。
array_filterはキーを維持してフィルタリングを実行します。

コールバック関数を省略する

array_filterはコールバック関数を省略するとTRUEとみなせる要素のみを結果の配列に格納します。

<?php

$arr = [0, 1, 0, 2];  // 配列
$result = array_filter($arr);  // コールバック関数を省略

print_r($result);  // 結果を出力

?>

出力結果。

Array
(
    [1] => 1
    [3] => 2
)

0FALSEとみなせるので↑の場合、結果の配列には格納されません。

配列のキーをフィルタリングする

array_filterの第3引数にARRAY_FILTER_USE_KEYを指定すると、配列のキーのみをコールバック関数内で処理できます。
↓はキーがcatの要素のみを結果の配列に残すコードです。

<?php

/**
 * キーが'cat'の要素を抽出するコールバック関数
 */
function keep_cat($key) {
    return $key === 'cat';
}

$arr = ['cat' => 'nyan', 'dog' => 'wan'];  // 連想配列
$result = array_filter($arr, 'keep_cat', ARRAY_FILTER_USE_KEY);

print_r($result);  // 結果を出力

?>

出力結果。

Array
(
    [cat] => nyan
)

配列のキーと値をフィルタリングする

array_filterの第3引数にARRAY_FILTER_USE_BOTHを指定すると、配列のキーと値をコールバック関数内で処理できます。
↓はキーがcat, 値がnyanの要素のみを結果の配列に残すコードです。
コールバック関数に渡される引数の順番が「値, キー」になっていることに注意してください。


<?php

/**
 * 値が'nyan'でかつキーが'cat'の要素のみを抽出するコールバック関数
 */
function keep_cat_and_nyan($val, $key) {
    return $val === 'nyan' && $key === 'cat';
}

$arr = ['cat' => 'nyan', 'dog' => 'wan'];  // 配列
$result = array_filter($arr, 'keep_cat_and_nyan', ARRAY_FILTER_USE_BOTH);

print_r($result);  // 結果を出力

?>

出力結果。

Array
(
    [cat] => nyan
)

ラムダ関数でフィルタリングする

PHP5.3以降からラムダ関数をarray_filterのコールバック関数に指定することができます。

<?php

/**
 * 値が2より下の要素だけを抽出するコールバック関数
 */
$under_two = function ($x) {
    return $x < 2;
};

$arr = [0, 1, 2, 3];  // 配列
$result = array_filter($arr, $under_two);  // ラムダ関数を指定して実行

print_r($result);  // 結果を出力

?>

出力結果。

Array
(
    [0] => 0
    [1] => 1
)

出題

Q1: array_filterの第1引数として適当なものを答えよ

  1. 配列

  2. 関数

  3. フラグ

Q2: array_filterのコールバック関数の返り値として適当なものを答えよ

  1. boolean

  2. integer

  3. string

Q3: array_filterのコールバック関数にキーと値を渡したいときに適当なフラグを答えよ

  1. ARRAY_FILTER_USE_KEY

  2. ARRAY_FILTER_USE_BOTH

  3. ARRAY_FILTER_USE_VALUE


正解

Q1: 1
Q2: 1, 2, 3
Q3: 2



この記事のアンケートを送信する