3つのフラグを見てその結果で1つのフラグ(全部許容することをいみする)を判定結果にまぜたいのですが、
変数の存在判定やnullチェックをするとくどい処理になってしまうことと、
3つすべての判定と、2つだけ判定する場合など複数あるのでどうやると簡潔に書けるかご教授いただきたいです。
$res = $this->api->get(); if( isset($res['a_flag']) && isset($res['b_flag']) && isset($res['c_flag']) && $res['a_flag'] == '1' && $res['b_flag'] == '1' && $res['c_flag'] == '1' ){ $res['z_flag'] = '1'; } return $res;
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
そのif文に到達したタイミングで$resが未定義の状態があることが問題と思います。
事前に明示的に初期化しておけば、if文の度にissetで確認する必要はなくなります。
PHP
1// 初期化 2$res['a_flag'] = ''; 3$res['b_flag'] = ''; 4$res['c_flag'] = ''; 5 6// 何か処理 7 8if( $res['a_flag'] == '1' && $res['b_flag'] == '1' && $res['c_flag'] == '1' ){ 9 $res['z_flag'] = '1'; 10} 11return $res; 12
追記です。
存在チェックを入れたいのであれば、isset関数は複数パラメーターを受け付けるので、こう書き直すこともできます(が、あんまりスッキリ感はないですね…)
PHP
1if( isset($res['a_flag'], $res['b_flag'], $res['c_flag']) && 2 $res['a_flag'] == '1' && $res['b_flag'] == '1' && $res['c_flag'] == '1' ){ 3 $res['z_flag'] = '1'; 4}
投稿2017/02/27 01:40
編集2017/02/27 02:20総合スコア16998
0
キーのリストがわかっているのでしたらデフォルト値を配列にしておいて
array_merge()すればいいだけでは?
PHP
1//仮データ 2$res['b_flag'] = ''; 3$res['c_flag'] = '1'; 4 5$var=['a_flag'=>null,'b_flag'=>null,'c_flag'=>null,'d_flag'=>null]; 6$var = array_merge($var,$res); 7var_dump($var); 8
投稿2017/02/27 03:19
総合スコア114755
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
方法はいろいろ考えられますが、例えば以下のような関数を定義する、という手もあります。
php
1function issetAndEquals($res, $comparison) { 2 foreach ($comparison as $key => $val) { 3 if (!isset($res[$key]) || $res[$key] != $val) { 4 return false; 5 } 6 } 7 return true; 8}
使用例
php
1$comparison = array( 2 'a_flag' => '1', 3 'b_flag' => '1', 4 'c_flag' => '1', 5); 6 7function issetAndEquals($res, $comparison) { 8 foreach ($comparison as $key => $val) { 9 if (!isset($res[$key]) || $res[$key] != $val) { 10 return false; 11 } 12 } 13 return true; 14} 15 16////////////////////////////////////////////////////////////////////////////////// 17 18// $res = $this->api->get(); 19$res = array( 20 'a_flag' => '1', 21 'b_flag' => '1', 22 'c_flag' => '1', 23); 24 25// if( isset($res['a_flag']) && isset($res['b_flag']) && isset($res['c_flag']) 26// && $res['a_flag'] == '1' && $res['b_flag'] == '1' && $res['c_flag'] == '1' ){ 27if (issetAndEquals($res, $comparison)) { 28 $res['z_flag'] = '1'; 29} 30// return $res; 31var_dump($res);
実行結果
array(4) { ["a_flag"]=> string(1) "1" ["b_flag"]=> string(1) "1" ["c_flag"]=> string(1) "1" ["z_flag"]=> string(1) "1" }
これなら、引数 $comparison を切り替えるだけで、汎用的に使用できます。
投稿2017/02/27 03:01
総合スコア4791
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
何が何でも一度の判定にまとめる、というのがかえって複雑化しているような気がします。
$res['z_flag'] が '1' となる条件は、
- $res['a_flag'] が '1' であり
- $res['b_flag'] が '1' であり
- $res['c_flag'] が '1' である
とき、だけですよね。
各フラグが 0/1 しか入らないという条件のもとで、
PHP
1$res['z_flag'] = '0'; 2if (isset($res['a_flag']) && isset($res['b_flag']) && isset($res['c_flag'])) { 3 $res['z_flag'] = ($res['a_flag'] * $res['b_flag'] * $res['c_flag'] == 1 ? '1':'0'); 4}
でいけるかな。
※個人的には $res[*] は '0'/'1' ではなく、0/1 であって欲しい
投稿2017/02/27 01:48
総合スコア13703
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/27 02:17
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/27 01:51 編集
2017/02/27 02:08
2017/02/27 02:56 編集