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

ダブランとTRPGを愛する、いわゆる「紙一重」の元web会社員が、
夢を叶えようとしたり趣味にいそしんだりする場末のブログ。

HN 餅。
好きなポケモン ダブラン・バタフリーたん・リザードン先輩・ピンクの悪魔ラッキー

ifで分岐させる二つの処理が9割共通する場合

Web > PHP 2020年12月1日

どもです。

ifで分岐させる二つの処理の9割が共通する、ということであれば、

if(☆☆){
	//共通処理
	//☆☆専用の処理
}else if(△△){
	//共通処理
	//△△専用の処理
}

と書くよりも、

if(☆☆ || △△){
	//共通処理
	if(☆☆){
		//☆☆専用の処理
	}else{
		//△△専用の処理
	}
}

と書きたいけれど、この☆☆と△△が複雑だったり重い処理だったりすると、これを2回繰り返すというのはできればやりたくない。

ので、こうする。

if(($a = function_a()) || ($b = function_b())){
	//共通処理
	if($a){
		//function_a()=true専用の処理
	}else{
		//function_b()=true専用の処理
	}
}

こうすると、$aと$bがそれぞれfunction_a()とfunction_b()の結果になるため、結果の変数をifにかけるとで2回目のifを省略できる。

留意点はふたつ。

ひとつは、それぞれの判定を必ず括弧で囲むこと。
if($a = function_a() || $b = function_b())
としてしまうと、$a = (function_a() || $b = function_b()) として処理されてしまい、
function_a()=false, function_b()=true の場合に $a=true になってしまう。

ふたつ目は、$bを初期化する必要があること。
function_a() がtrueとなった場合にそこでifは終了してしまうので、$bの値を用いる場合は必ずどこかで$bの初期化をしておかなければならない。
でないと、ループ中の処理の場合は前ループの値が引き継がれてしまうし、引き継ぐ値が無ければ$bは未定義状態になる。

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