フロント側で使う外部APIのラッパーを作っていた時に、こんなレスポンスに遭遇しました。
php
1$outsideResponse = [ 2 'id' => 2, 3 'tag1' => 'ハイブリット', 4 'tag2' => '新車', 5 'tag3' => null, 6]; 7 8※idは無視してください。tag以外にもデータが入ってることをわかりやすくするために入れてます。
仕様書によればタグは3つ固定で、設定されてなければnullが入るんだとか。これをそのままフロント側に渡すのは流石に扱いづらいと思ったので、nullを除くすべてをまとめることにしました。
php
1$tags = [ 2 'ハイブリット', 3 '新車', 4]
とりあえず変数にまとめるとすればこんな感じです。しかし僕はここで$outsideResponse
から$tags
の状態にするコードをどう書くか迷ってしまいました。オーソドックスに書けば、
php
1$tags = null; 2if ($outsideResponse['tag1'] !== null) { 3 $tags[] = $outsideResponse['tag1']; 4} 5if ($outsideResponse['tag2'] !== null) { 6 $tags[] = $outsideResponse['tag2']; 7} 8if ($outsideResponse['tag3'] !== null) { 9 $tags[] = $outsideResponse['tag3']; 10}
こんな感じになると思います。しかし、いくら3つで固定されているからとはいえ、同じif文のコードを何度も書くのは僕にはちょっと違和感があります。できればこのコードをスマートにしたい。そこでこのコードをどう省略するか考えてみたのですが、どれもいまいちしっくりきません。
【foreachを使って省略】
php
1$key = [ 2 'tag1', 3 'tag2', 4 'tag3', 5]; 6$tags = null; 7foreach ($key as $value) { 8 if ($outsideResponse[$value] !== null) { 9 $tags[] = $outsideResponse[$value]; 10 } 11}
(しっくりこない点)
・$keyの配列数が増えれば増えるほど、結果的にコードが長くなる点(スマートになってない)。定数化して別ファイルにしてもいいですが、たがかnull判定でそこまでする?
・キーを配列化してforeachで回すという流れが、そもそも回りくどいように思えてきたから。
【三項演算子?で省略する】
php
1 2$tags = null; 3$outsideResponse['tag1'] !== null && $tags[] = $outsideResponse['tag1']; 4$outsideResponse['tag2'] !== null && $tags[] = $outsideResponse['tag2']; 5$outsideResponse['tag3'] !== null && $tags[] = $outsideResponse['tag3'];
(しっくりこない点)
・この書き方をしている人を見たことがない。この記事で知ったのですが、これは三項演算子なんでしょうか。それとも論理演算子?
・そもそも三項演算子があまり好きじゃない。1行に省略できるのは魅力的ですが、条件が複雑になれば複雑になるほど見づらくなるのがちょっと・・・。
このような感じで、結局なにも省略しないのが一番スマートなんじゃないかと思い始めてきたのですが、他の方の意見も聞いてみたいと思ってこのような質問をしてみました。もしよければ意見をお聞かせください。
回答4件
あなたの回答
tips
プレビュー