何があったの?
array_filterでアホを炙り出そうとした時、
$data = ['バカ', '天才', 'アホ', '秀才'];
$aho = array_filter($data, fn($o) => $o ?? '' === 'アホ');
print_r($aho); //結果 → ['バカ', '天才', 'アホ', '秀才']
自称アホが多すぎる、、、そんなはずはない。
原因は至って単純でした。
$o ?? ''
の比較と'' === 'アホ’
の比較では'' === 'アホ’
が優先され結果全てにfalse
が返った結果自称アホが多くなってしまったようです。
①$o ?? ''
の比較と'' === 'アホ'
の比較で、'' === 'アホ'
が優先される。(比較の結果はfalse)
②$o ?? false
で比較される。
③$o
がnull
でない限り、$o
がそのまま条件に(結果true)
これで全部の条件がtrueとなって返ってくるようです。
??
を便利ツール的な立ち位置に錯覚してましたが、===
と同じ演算子に変わりないので、注意が必要ですね、、、
ちなみに、
https://www.php.net/manual/ja/function.array-filter.php
array_filterの仕様で、フィルターにかける変数がfalseを返すもの(false, NULL, '')は自動で削除してくれるみたい。。。
→これは明確に間違いで、第2引数に何も入れない場合に自動で消してくれるようです。
【例】
$data = ['バカ', '天才', null, 'アホ', false, '秀才'];
const $aho = array_filter($data); // ['バカ', '天才', 'アホ', '秀才'];
第2引数を使う場合、条件の結果trueのものが配列に格納されるので、自動で消してくれるのは今回は関係ないです。
$o ?? ''
で気を利かせてましたが、??
を入れなくてもエラーは出ないようです。
解決策
変に気を利かせなくてもいいみたい。
$data = ['バカ', '天才', 'アホ', '秀才'];
$aho = array_filter($data, fn($o) => $o === 'アホ');
print_r($aho); //結果 → ['アホ']
無事、アホを炙り出すことに成功しましたね。(やったー😆)
追記
比較する値が配列だった場合は注意が必要です。
<?php
$data = [
['title' => 'バカ'],
['title' => '天才'],
['title' => 'アホ'],
null,
['title' => '秀才'],
];
var_dump(array_filter($data, fn($o) => ($o['title'] ?? '') === 'アホ'));
var_dump(array_filter($data, fn($o) => ($o['title']) === 'アホ'));
この場合()で括ってNULLチェックを入れないとエラーが出るようです!(実際にはこっちのパターンが多いのでわかって助かりました。。。)
null
ではなく['title' => NULL],
の時はNULLチェックはいらないですね。(この辺の概念難しい、、、セブンでファミチキ頼む〜みたいなのをXで見た気がする。。。)
コメント参照