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

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

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

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

Q&A

解決済

2回答

911閲覧

行儀のいい中断処理は?

KazuhiroHatano

総合スコア7802

PHP

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

0グッド

1クリップ

投稿2017/12/28 02:56

複数の配列のすべての値に対して条件を満たす場合にのみ処理を行う
というようなことをする場合、一個でも条件を満たさなければ
その時点で以降の判定処理もすっとばしたいわけなのですが
その時の行儀のいいやり方について悩んでおります

php

1while(true){ 2 foreach(as){ 3 if(!){break 2;} 4 } 5 foreach(as){ 6 if(!){break 2;} 7 } 8 〜処理〜 9 break; 10} 11〜続き〜

continueで無限ループの可能性が微レ存

php

1switch(true){ 2 case true: 3 foreach(as){ 4 if(!){break 2;} 5 } 6 foreach(as){ 7 if(!){break 2;} 8 } 9 〜処理〜 10} 11〜続き〜

whileでいいんじゃないかな…

php

1call_user_func(function(,)use(&,&){ 2 foreach(as){ 3 if(!){return false;} 4 } 5 foreach(as){ 6 if(!){return false;} 7 } 8 〜処理〜 9 return true; 10},,);

安全っぽいけどめんどい

php

1foreach(as){ 2 if(!){goto hoge;} 3} 4foreach(as){ 5 if(!){goto hoge;} 6} 7〜処理〜 8hoge: 9〜続き〜

PHPにもgotoはあるんだよなぁ

個人的にはcall_user_funcが一番いいのかな、とも思ってるんですが
条件判定のためだけに関数を作っちゃうのは
結構負荷が大きいから避けるべきなのか?とかも思っちゃいます

使い分けた方がいいのか、やり方を統一しておいたほうがいいのか
あるいはこれら以外にもっと良いやり方があるのか

よろしくお願いします

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

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

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

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

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

yambejp

2017/12/28 03:04

もう少し具体的なデータを出してもらったほうがよいでしょう。while(true)やswitch(true)は本質的な利用方法ではないのであまりおすすめしませんけどね
ku__ra__ge

2017/12/28 03:39

判定を関数にまとめてはならないといった縛りがあるのでしょうか?
KazuhiroHatano

2017/12/28 05:09

特に縛りがあったり、具体例があるわけではありません、 ただ、何度となくこういうif(〜)にまとめられない複合的条件判定を行うことがあったので どういう方針を持って臨むべきかといった悩みです
yambejp

2017/12/28 05:27

直接回答ではないですがwhile(true)で1順目で強制breakするなら、do{}while(false)の方がまだましかと。それも昔どこかの技術板で書いたら「そんなクズみたいな回答するな」と怒られたやつですけどね
KazuhiroHatano

2017/12/28 05:37

なるほどdo{}while(false)の方が無限ループのリスクが少ないですね
guest

回答2

0

ベストアンサー

条件判定のためだけに関数を作っちゃうのは

結構負荷が大きい

ここでいう負荷といのが何かわかりませんが、関数を作るのには処理に名前が付けられるという
メリットがあります。
きちんと命名すれば、メンテナンスする人のコードリーディングの負荷は下がるかと

if (複数の配列のすべての値に対して条件を満たす(xxxx) ) { // 処理 }

ところで、具体例がないのでなんともいえないですが、条件判定は2つ同時にできないのですか?

foreach(〜 as 〜){ if(!〜 || !〜){return false;} }

投稿2017/12/28 03:38

momon-ga

総合スコア4820

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

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

KazuhiroHatano

2017/12/28 05:35

回答ありがとうございます 今の自分の方針は割とcall_user_func(無名関数)寄りなんですが 「メソッド内で無名関数使うとメソッド実行のたびに関数作られちゃってないか?」 「無名関数はPHP5.2では使えないわけだけど、PHP5.2なんてもう想定しなくていいのか?」 といったところが悩みのタネです しかも複雑な条件判定というのが「判定に利用する変数がめちゃくちゃ多い」 「使う変数が減ったり増えたりすることが割とある」ということでもあったりして 関数・メソッドにすると引数がとんでもなく多かったり、変更に伴う修正箇所が増えたりするために 普通に関数・メソッドを作るのではなく無名関数にしていたりします
ku__ra__ge

2017/12/28 11:40

引数オブジェクトの導入を検討してはどうでしょうか?抽象化された情報の塊であるオブジェクトを受け渡すのであれば、多くの値を1つの変数で受け渡せますし、呼び出し部分に手を加えることなく判定に利用する変数の増減に対応できます。
guest

0

処理の意味合いにもよりますが、例外を使うか、関数化するのが自然に思います。

一か所でしか使わない処理に対して関数化することを負担に感じているのかもしれませんが、momon-gaさんの書かれているように処理が明確で名前が付けられることのほうが重要です。ソースコードの量だとか関数の数を減らしたいというのは書き手の都合に思います。

関数が小さくなればテストもしやすくなりますよ。

投稿2017/12/28 04:18

nullbot

総合スコア910

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

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

KazuhiroHatano

2017/12/28 05:20

回答ありがとうございます 今回の質問の契機になったものについては 「粒度」「テストコードの書きやすさ」 というものも考えるべきだった という後悔をしている最中です… 渡すダミーデータを作るのさえ 面倒くさいような代物だったので その辺をないがしろにして 今まさにツケを食らってます…
KazuhiroHatano

2017/12/28 06:02

ちなみにだけ書いておくと、学校の予約システムの予約制限の処理です 講師(1〜2人)と教室によって受け入れ可能な授業の種類や人数が違い 授業によって一度に数種類受け持てたり持てなかったり… 最初は授業の種類は講師一人につき1種類って話だったんですけどねぇ 「いや、この授業なら2〜3個は大丈夫です、実は」 みたいな話になって、αテストを目前に控えた今から 授業ごとに負荷値を設定して、予約制限の処理方法をイチから見直し…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問