ど素人から毛を生やす。<延>

array_search()やin_array()する前には、ちゃんとarray_map('trim', $array)するんだぞ!ってメモ。

Web > PHP 2019年4月23日(最終更新:6月前)

どもです。
しょーもないことでハマったので備忘。

外部から貰ったCSVを取り込むのに、その項目が何列目にあるかをarray_search()で照合しようとしたら、特定の項目でfalse食らってしまったわけですね。

array_search()でやらかし易いミスといえば、

・第三引数にtrueを設定しないことで、文字列型と数値型の比較になってしまう。
・返り値0を考慮せず、if文にて「===false」を省略する

の2種類と思われます。
これはarray_search()の関数としての特性に由来することなので、探したらすぐに事例が出ます。

が、本件はもっと下らない話。

外部業者がCSVの出力でミスって、

"項目名1","項目名2","項目名3"

なんてCSVをくれやがったことで、項目名1が「項目名1」になってしまったというだけの話だったのです。

ただ、CSV上の順番を返す関係で、foreachしていたのがこちらの用意した項目名リストだったため、気づくのが遅れてしまったのですなぁ。間抜けめ。

さて、こういうケースを未然に防ぐ手段は、たった一行です。

$array = array_map('trim', $array);

事前に前後の空白は取っておくんだぞ!

ちなみに、array_map()で検索すると、array_map()を非推奨する記事が上に出てくるので自信を失いますが、こーいった“既存の関数”を“配列全体にかける”必要のある処理なら、やっぱりforeach()よりarray_map()です。

そもそも配列でなくてオブジェクトで管理する案もあるっちゃありますが…
遥かに冗長になるんで、PHPで何でもかんでもオブジェクトにするのはどうなんだろー?と思う素人ごころ。

この記事は役に立ちましたか?
  • _(:3」∠)_ 面白かった (0)
  • (・∀・) 参考になった (0)
  • (`・ω・´) 役に立った (0)