PHPでは、 array_filterは、コールバック関数の返された結果に基づいてarrayをフィルタリングするための非常に実用的な関数です。デフォルトでは、コールバック関数が提供されていない場合、 array_filterは「falsy値」と見なされるすべての要素を削除します。これらの「偽の値」には次のものが含まれます。
間違い
ヌル
0 (整数)
'0' (文字列)
'' (空の文字列)
[] (空の配列)
これは、特に開発者が元々 nullまたは空の文字列を削除したい場合に、一部の開発者を混乱させる可能性がありますが、整数0でさえ一緒に削除されていることがわかりました。それで、なぜこれが起こっているのですか?もっと深く見てみましょう。
PHPは弱いタイプの言語です。つまり、ブール操作を実行すると、特定のタイプをブール値に自動的に変換します。このメカニズムは、タイプジャグリングと呼ばれます。ブールのコンテキストでは、次の値は偽として解釈されます。
var_dump((bool) false); // false
var_dump((bool) null); // false
var_dump((bool) 0); // false
var_dump((bool) '0'); // false
var_dump((bool) ''); // false
var_dump((bool) []); // false
値がブール型とfalseに変換される限り、 array_filterはデフォルトでそれをフィルタリングします。
array_filter関数プロトタイプは次のとおりです。
array_filter(array $array, ?callable $callback = null, int $mode = 0): array
2番目のパラメーター$ callbackがnullの場合、 array_filterは実際には次のように機能します。
$result = [];
foreach ($array as $key => $value) {
if ((bool) $value) {
$result[$key] = $value;
}
}
例えば:
$data = [0, 1, 2, null, '', 'hello', false];
$result = array_filter($data);
// 消す [1 => 1, 2 => 2, 5 => 'hello']
ご覧のとおり、 0 、 null ' 、およびfalseはすべて「偽」と見なされるため、削除されます。
null値をフィルタリングして0と空の文字列を保持するだけの場合、たとえばカスタムコールバック関数を渡すことができます。
$data = [0, '0', '', null, false, 'PHP'];
$result = array_filter($data, function ($item) {
return !is_null($item);
});
// それを保管してください 0、'0' そして ''
たとえば、空の文字列を削除するだけの場合:
$result = array_filter($data, function ($item) {
return $item !== '';
});
これにより、特定のニーズに応じて保持する必要がある値を慎重に制御できます。
フォーム提出システムを構築していると仮定し、フロントエンドフォームがいくつかの空のフィールドを渡し、ユーザーが実際に記入したものだけを保持したいとします。
$formData = [
'name' => 'Alice',
'email' => '',
'age' => 0,
'website' => null,
];
$filtered = array_filter($formData, function ($value) {
return $value !== '' && !is_null($value);
});
print_r($filtered);
出力結果:
Array
(
[name] => Alice
[age] => 0
)
この結果では、空の文字列とnullが削除されますが、ユーザーが0歳で実際に埋められた可能性があるため、 0が保持されます。
array_filterを使用する場合、PHPの「偽値」の概念を理解することが重要です。デフォルトでは、 nullまたは空の文字列だけでなく、boolean falseに相当するすべての値を削除します。より正確なフィルタリング動作が必要な場合は、常にカスタムコールバック関数を渡すことをお勧めします。
このようにして、ユーザーが記入する「0」の値など、誤って有効なデータを削除することを避けることができます。また、さまざまなビジネスシナリオに柔軟に対処することもできます。