0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【PHP】array_filterで取得したいデータが取れない!!

Last updated at Posted at 2025-03-03

何があったの?

array_filterでアホを炙り出そうとした時、

$data = ['バカ', '天才', 'アホ', '秀才'];
$aho = array_filter($data, fn($o) => $o ?? '' === 'アホ');
print_r($aho); //結果 → ['バカ', '天才', 'アホ', '秀才']

自称アホが多すぎる、、、そんなはずはない。
原因は至って単純でした。
$o ?? ''の比較と'' === 'アホ’の比較では'' === 'アホ’が優先され結果全てにfalseが返った結果自称アホが多くなってしまったようです。

$o ?? ''の比較と'' === 'アホ'の比較で、'' === 'アホ'が優先される。(比較の結果はfalse)
$o ?? falseで比較される。
$onullでない限り、$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で見た気がする。。。)
コメント参照

0
0
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?