gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

foreachとか使わないのかしらん?

定期的に見かけるんだけど、今日もふと見かけたので、割と本気で疑問なので一度書いておこうかなぁ、と。
おいちゃん的には「foreachでくるんだらほんの少しだけ楽ぢゃない?」って思うようなコードが割とコピペで書かれているのを散見するので、「なんか理由があるのか」「とくに理由がないのか」興味もありまして、的な。


ん……典型的にわかりやすいのは、例えば、以下。

$data['hoge'] = $awk['hoge'];
$data['foo'] = $awk['foo'];
$data['bar'] = $awk['bar'];

面倒だから3行しか書いてないけど、これが10行以上とか、わりとざらに拝見。
おいちゃんなら

$params = ['hoge', 'foo', 'bar'];
foreach($params as $p) {
    $data[$p] = $awk[$p];
}

って書くかなぁ。
各項目ごとにちゃんとコメントが入ってるんなら

$params = [
    'hoge', // コメント
    'foo', // コメント
    'bar', // コメント
];

こげな感じで。


例えば「入れる側にprefixとかsuffixとか入れたい」なんてケースもあると思うのよ。

foreach($params as $p) {
    $data[$p . $suffix] = $awk[$p];
}

で終了


「いやいやそうじゃなくて配列じゃなくて変数名として使いたい」ってケースも、時々。
コード的にはこげな感じ。

$hoge = $awk['hoge'];
$foo = $awk['foo'];
$bar = $awk['bar'];


これは

foreach($params as $p) {
    $$p = $awk[$p];
}

で片付く。$paramsの中身が「ちゃんと変数名としてvalidである必要」はあるんだけどね。


これらの利点って。
単純に「項目が増えたり減ったり」、あと「個々の要素になにかひと手間加えたりしたくなった」時に、地味に便利なんじゃないかなぁ、って思うの。
typoの可能性が「原理的に0になる」し、わずかとはいえ「手間が省ける」のは、その手法を選択する「デメリット」がないのであれば、そっちのほうが楽なんじゃないかなぁ? と。
あと、個人的には「先頭に"処理対象を宣言"しておく」のが、可読性の観点から、読みやすいんじゃないかなぁ、と。まぁ単純に「おいちゃん好み」って言い方にしてもよいのだけど。


なので、この辺やらずにえっちらおっちらコピペしてるコードをみると、「……なんでだろ?」って疑問に思うのですだよ。
ってなわけで、興味があったのでメモり。
「いや実はこーゆー理由があってね」的な話があったら、きっと、コメントに書いてくれる人がいると、おいちゃんは信じてるw