PHPでは、 array_filter()は、コールバック関数の結果に基づいてアレイ内の要素をフィルタリングするために使用される非常に一般的な配列関数です。その使用法は単純に見えるかもしれませんが、多くの開発者は、特にコールバック関数を書くときに、それを使用するときの返品値の「ブールの意味」に困惑しています。
たとえば、誰かが次のコードを書きました。
$input = [0, 1, 2, 3, 4, 5];
$result = array_filter($input, function($value) {
return $value % 2; // 奇数を保つことを願っています
});
print_r($result);
彼らは出力が[1、3、5]であると予想されるかもしれません、そして、結果もそうです。ただし、この例を少し変更すると、混乱を簡単に引き起こします。
$input = [0, 1, 2, 3, 4, 5];
$result = array_filter($input, function($value) {
return $value % 2 == 0; // 偶数を保つことを願っています
});
print_r($result);
多くの人々は、真実を返すときに要素が保持され、偽りに戻ると、除外されると考えています。これは確かに真実です。しかし、重要なのは、PHPが動的に型付けされた言語であり、コールバック関数によって返される値はブール値にキャストされることです。
PHPのこれらの値はfalseに変換されます。
ブール値False
整数0
フローティングポイントタイプ0.0
空の文字列''または「0」
空の配列[]
ヌル
したがって、次のコードを書くとき:
$input = ['a', '', 'b', '0', 'c'];
$result = array_filter($input);
print_r($result);
出力は次のとおりです。
Array
(
[0] => a
[2] => b
[4] => c
)
コールバック関数が指定されていない場合、 array_filter()は、デフォルトでブールキャストを使用して、要素が保持されているかどうかを判断します。したがって、空の文字列と「0」の両方が除外されます - それらはfalseに変換されるためです。
この時点で、多くの人々が混乱するでしょう:「私は明らかに価値を持っています、なぜそれが除外されたのですか?」
開発者がコールバックを使用して非ブールのタイプを返す場合、さらに誤解が発生します。
$input = [1, 2, 3, 4, 5, 6];
$result = array_filter($input, function($value) {
return $value & 1; // ビットワイズを使用して、奇数を判断します
});
print_r($result);
このコードは正しいですが、初心者を夢中にさせるかもしれません。 $ value&1の結果は0または1です。$値が偶数である場合、結果は0であり、 Falseに変換され、フィルタリングされます。現時点では、 1または0を返す値が要素が保持されているかどうかを決定するのではなく、ブール環境でのこれらの値のパフォーマンスが決定されることではないことを理解する必要があります。
多くの人が気づいていないもう1つのこと: array_filter()が元の配列のキー名を保持しています。インデックスを再構築する場合は、 array_values()を使用できます。
$result = array_values(array_filter($input, function($value) {
return $value > 2;
}));
たとえば、URLのセットからトークンパラメーターなしでリンクをフィルタリングする必要があります。
$urls = [
'https://m66.net/page1?token=abc',
'https://m66.net/page2',
'https://m66.net/page3?token=xyz',
];
$filtered = array_filter($urls, function($url) {
$parts = parse_url($url);
if (!isset($parts['query'])) {
return false;
}
parse_str($parts['query'], $query);
return isset($query['token']);
});
print_r($filtered);
このコードのコールバック関数は、型変換によって混同されないようにブール値(真またはfalse )を明示的に返します。
多くの人々は、array_filter()コールバック関数の返品値の「ブール意味」を理解していません。最終分析では、PHPの「真と偽の値」を深く理解していません。信頼できるarray_filter()コールバック関数を書くには、覚えておいてください。
コールバック関数の返品値は、ブール値に変換されます。
タイプ(数字や文字列など)に「値」があるかどうかに直接依存しないでください。
あなたの意図が明確な論理的判断である場合、ブール式を明示的に書きます。
このようにして、この強力で簡単に誤解された機能を完全に習得できます!