質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

5回答

732閲覧

PHP無駄に長い処理を短縮したい

MeB

総合スコア104

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2018/01/30 00:48

php

1<?php 2 if ($r1 == 1 || $r2 == 1 || $r3 == 1 || $r4 == 1 || $r5 == 1 || $r6 == 1 || $r7 == 1) { 3 echo '</div>'; 4 } elseif ($v1 == 1 || $v2 == 1 || $v3 == 1 || $v4 == 1 || $v5 == 1 || $v6 == 1 || $v7 == 1 || $sel == 'select2') { 5 echo ''; 6 } elseif ($w1 == 1 || $w2 == 1 || $w3 == 1 || $w4 == 1 || $w5 == 1 || $w6 == 1 || $w7 == 1 || $sel == 'select3') { 7 echo '</div>'; 8 } elseif ($r1 == '0' || $r2 == '0' || $r3 == '0' || $r4 == '0' || $r5 == '0' || $r6 == '0' || $r7 == '0') { 9 echo '</div>'; 10 } elseif ($v1 == '0' || $v2 == '0' || $v3 == '0' || $v4 == '0' || $v5 == '0' || $v6 == '0' || $v7 == '0' || $sel == 'select2') { 11 echo ''; 12 } elseif ($w1 == '0' || $w2 == '0' || $w3 == '0' || $w4 == '0' || $w5 == '0' || $w6 == '0' || $w7 == '0' || $sel == 'select3') { 13 echo '</div>'; 14 } else { 15 echo ''; 16 } 17 ?>

formからきた値によってタグの出し分けをしているだけなのですが、
この書き方絶対無駄が多いと思うのですがどう短くしたらいいかわからず
質問させていただきました。
このコード短縮できますでしょうか?
ご教示よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttyp03

2018/01/30 01:28

それぞれの値は、1か'0'のみなのでしょうか?数値と文字が混在しているのが気になります。
guest

回答5

0

ベストアンサー

同じ値の==が続く部分については、in_arrayリファレンス)を使って以下のように表現できます。

php

1//before 2if ($r1 == 1 || $r2 == 1 || $r3 == 1 || $r4 == 1 || $r5 == 1 || $r6 == 1 || $r7 == 1) { 3 4// after 5if(in_array(1, [$r1, $r2, $r3, $r4, $r5, $r6, $r7]))

なお、PHPの==の挙動は複雑怪奇です。意図してやっているのでなければ、十分な注意が必要です(リファレンス)。

また、コード全体を見渡せば、もっと大胆に改良できる可能性もありますが、とりあえずはこんなことができる、という例示です。

投稿2018/01/30 01:12

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

いくつか課題があります。

  1. 前回の質問(?)時にも指摘されていたと思いますが、

配列で処理する気はないでしょうか?
0. また仮に変数をつかうとしてもデータ型は大丈夫でしょうか?
つまり、「$r1 == 1」は「$r1 === 1 」にしたいのか、逆に曖昧に
「$r1 == true」でもいいのか、さらにいえば「$r>0」のように
1でなくてもいいのか、とくに1は数値で0は文字列で比較しているのもよろしくないでしょう
0. 場合によっては$r1がセットされていないなど存在チェックは必要ないでしょうか?

その辺の仕様を固めないと簡略化の方針がきまりません。

sample

各変数が1か0のいずれかで、常にセットされているなら判定はこれでいいですね

PHP

1/*どれかが1である*/ 2print (0 | 0 | 0)?"OK":"NG"; 3print (1 | 0 | 0)?"OK":"NG"; 4print (1 | 1 | 1)?"OK":"NG"; 5 6/*どれかが0である*/ 7print !(0 & 0 & 0)?"OK":"NG"; 8print !(1 & 0 & 0)?"OK":"NG"; 9print !(1 & 1 & 1)?"OK":"NG";

結局は条件次第ということ

投稿2018/01/30 01:15

編集2018/01/30 01:36
yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MeB

2018/01/30 03:45

確かにその通りですね。しつれいしました。 sample非常に参考になりました!
guest

0

フラグによって、</div> を管理したいという要件と理解しました。
ビット操作で結果を整理する方針にするときれいに書けるかもしれません。

投稿2018/01/30 01:10

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

個人的には、echo </div>echo ''という2種類の処理で分類すると少し簡単になると思います。
(要するにとあるケースでは、echo </div>とし、それ以外echo ''とするイメージ)

php

1if (($r1 === 1 || $r2 === 1 || $r3 === 1 || $r4 === 1 || $r5 === 1 || $r6 === 1 || $r7 === 1) Or 2 ($r1 === '0' || $r2 === '0' || $r3 === '0' || $r4 === '0' || $r5 === '0' || $r6 === '0' || $r7 === '0') Or 3 ($w1 === 1 || $w2 === 1 || $w3 === 1 || $w4 === 1 || $w5 === 1 || $w6 === 1 || $w7 === 1 || $sel === 'select3')){ 4 echo '</div>'; 5}else{ 6 echo ''; 7}

他の方も仰っている事ですが、変数を配列にしたりコード全体を見直すことで、さらに簡潔にすることは出来ると思います。
とりあえず簡略化するとこうなる、という参考程度にしてみてください。

投稿2018/01/30 03:01

motuo

総合スコア3027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

全体の仕様やロジックの見直しをしたいところですが、
(自分なら採番された変数は使いづらいので、配列にしてしまいます)
既存の業務コードとなるとそうはいかないので、
簡単なリファクタリングで対応するという方針で回答いたします。

大量のif文で混乱する場合は、
評価をいったんフラグ変数に格納して、コードを見やすくするというアプローチがあります。
短くもなっていないし、すべて評価しているので処理速度的には多少不利ですが、
コードを切り分けていると、デバッグがちょっと楽になるので、
仕様追加時のストレスが軽減されるかと^^

php

1$isR1 = ($r1 == 1 || $r2 == 1 || $r3 == 1 || $r4 == 1 || $r5 == 1 || $r6 == 1 || $r7 == 1); 2$isV1 = ($v1 == 1 || $v2 == 1 || $v3 == 1 || $v4 == 1 || $v5 == 1 || $v6 == 1 || $v7 == 1); 3$isW1 = ($w1 == 1 || $w2 == 1 || $w3 == 1 || $w4 == 1 || $w5 == 1 || $w6 == 1 || $w7 == 1); 4$isR0 = ($r1 == '0' || $r2 == '0' || $r3 == '0' || $r4 == '0' || $r5 == '0' || $r6 == '0' || $r7 == '0'); 5$isV0 = ($v1 == '0' || $v2 == '0' || $v3 == '0' || $v4 == '0' || $v5 == '0' || $v6 == '0' || $v7 == '0'); 6$isW0 = ($w1 == '0' || $w2 == '0' || $w3 == '0' || $w4 == '0' || $w5 == '0' || $w6 == '0' || $w7 == '0'); 7 8//debug 9print_r( [ 'isR1'=>$isR1, 'isV1'=>$isV1, 'isW1'=>$isW1, 'isR0'=>$isR0, 'isV0'=>$isV0, 'isW0'=>$isW0 ]); 10 11if( $isR1 ) { 12 echo '</div>'; 13} elseif( $isV1 || $sel == 'select2' ) { 14 echo ''; 15} elseif( $isW1 || $sel == 'select3' ) { 16 echo '</div>'; 17} elseif( $isR0 ) { 18 echo '</div>'; 19} elseif( $isV0 || $sel == 'select2' ) { 20 echo ''; 21} elseif( $isW0 || $sel == 'select3' ) { 22 echo '</div>'; 23} else { 24 echo ''; 25}

追記:</div>を出すか出さないかなので、if-elseif部分は簡略化できそうですが、
どんなデータ構造で渡ってくるのかいまいち仕様が見えないため、そのまんま書きました。
整理整頓が出来ていれば、その先のリファクタリングへと進めるかと思います。

投稿2018/01/30 02:35

編集2018/01/30 03:08
so87

総合スコア764

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問