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

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

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

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

Q&A

解決済

4回答

1161閲覧

PHPの関数で配列を返すときに、条件不一致の処理がブサイクになってしまう

saikin

総合スコア16

PHP

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

0グッド

0クリップ

投稿2019/03/18 23:45

###実現したいこと

$get_datacorrectではないとき、echo '「$get_data」が「correct」ではありません。';を出力させたい。

ただし、ブサイクにならないように!

###該当のコースコード

check_data($check_data){}という関数があります。$get_datacorrectかどうかを判定し、correctなら$data1$data2を返すという処理です。

しかしブサイクな部分があります。

$get_datacorrectではない場合です。
(コメントアウトをなくして、$get_data = 'correct';ではなく$get_data = 'incorrect';にした場合です。)

現状では'error'returnしているのですが、このときにdata1data2のどちらに対してもreturn array( $data1, $data2 );と返してやらなければならない部分がとてもブサイクに感じます。

実際には$data3$data4とたくさんあるので、いちいち書きたくありません。

しかしこうせずdata1だけを'error'にしてreturn array( $data1 );などとすれば、list( $data1, $data2 ) = check_data($get_data);のところで「おいおい、配列の数おかしいやろ(PHP Notice: Undefined offset: 1 in)」と怒られてしまいます。

そこでお聞きしたいのですが、$get_datacorrectではないとき、このブサイクな方法を使うことなく、echo '「$get_data」が「correct」ではありません。';を出力させるには、どうしたらよいでしょうか?

PHP

1<?php 2function foo() { 3 4 function check_data($check_data){ 5 if( $check_data == 'correct' ) { 6 $data1 = 'ok1'; 7 $data2 = 'ok2'; 8 return array( $data1, $data2 ); 9 }else{ 10 $data1 = 'error'; 11 $data2 = 'error'; 12 return array( $data1, $data2 ); 13 } 14 } 15 16 $get_data = 'correct'; 17 //$get_data = 'incorrect'; 18 19 if( !empty($get_data) ){ 20 list( $data1, $data2 ) = check_data($get_data); 21 } 22 23 if( $data1 == 'error' ){ 24 echo '「$get_data」が「correct」ではありません。'; 25 }else{ 26 echo '「$get_data」が「correct」です。'.PHP_EOL; 27 echo $data1.PHP_EOL; 28 echo $data2.PHP_EOL; 29 } 30 31} 32 33foo();

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

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

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

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

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

m.ts10806

2019/03/19 00:02

「ぶさいくになってしまう」というような抽象的な表現ではなく具体的に「このようにしたい」と記載してください。感覚に依存するような内容は好ましくありませんし、「要件」は「こうする」であり「こうしたくない」ではありませんので。
m.ts10806

2019/03/19 00:04

また、$data1,$data2のようにマジックナンバーで命名された変数があります。 実際には3,4と続くようですが、それぞれ何のために利用するのでしょうか。 その用途次第で大きく作り方が変わってきます。
saikin

2019/03/19 08:41

失礼致しました。
m.ts10806

2019/03/19 08:43

質問は編集できますので適宜ご対応ください
guest

回答4

0

check_dataがチェックする以外のことをしているからおかしいのだと思います。
チェックして、正しかったら値の初期化、正しくなかったらエラーと分岐すれば正しくないことを伝えるために無意味な初期データを作らなくて済みます。

今のままのほうがマシだと思いますが古い作り方ではelseでnullを返して、isnullで判定してエラー分岐させると思います。

投稿2019/03/19 00:11

papinianus

総合スコア12705

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

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

saikin

2019/03/19 08:40

ありがとうございます。確かに仰る通りですね。関数を分けてみたいと思います。
guest

0

他言語からの移住でしょうか?

ブサイク以前に、設計がおかしいです。
$get_data の仕様が不明ですが、0 でも入力してみると設計がおかしいことが分かります。

投稿2019/03/19 00:20

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

maisumakun

2019/03/19 00:27 編集

(的はずれなコメントだったため抹消)
退会済みユーザー

退会済みユーザー

2019/03/19 00:26

その表現だとうまく伝わらない気がします。 今回は、empty の挙動なので。 設計としては !empty の条件文の中で error 確認する感じですかねぇ。
maisumakun

2019/03/19 00:27

そっちでしたか(自分の読み間違いでした)
退会済みユーザー

退会済みユーザー

2019/03/19 01:40

0 とか意味深なヤツ使ったせいですね^^; 最近、思考が php の問題点探しに特化してるので、0 突っ込めば?って書きましたが、そういう意味では、ちょっとミスリーディングかもしれないですね。。。
saikin

2019/03/19 08:39

ありがとうございます。検討します。
guest

0

ベストアンサー

設計方針みたいなんがあるでしょうから、あまりあれこれ
修正案を出すのはあれでしょうが…

papinianusさんが書かれているように、関数に機能を持たせすぎ
なのはなんとかした方がいいと思いますが、まあ、さておき。

<?php function foo() { function check_data($check_data){ $result = true; $data = array(); if( !empty($check_data) && $check_data == 'correct' ) { $data = array( $data1, $data2 ); }else{ $result = false; } return array( $result, $data ); } $get_data = 'correct'; //$get_data = 'incorrect'; list( $r, $d ) = check_data($get_data); if( $r ){ echo '「$get_data」が「correct」です。'.PHP_EOL; list($data1, $data2) = $d; echo $data1.PHP_EOL; echo $data2.PHP_EOL; }else{ echo '「$get_data」が「correct」ではありません。'; } } foo();

投稿2019/03/19 00:30

編集2019/03/19 00:32
takasima20

総合スコア7458

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

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

saikin

2019/03/19 08:39

ありがとうございます。質問に沿った形でお答えいただけたおかげで疑問が解けました。
guest

0

return array( $data1, $data2 );と返してやらなければならない部分がとてもブサイクに感じます。

わざわざ変数に入れずに、そのまま配列を立てて返せば、少しはスッキリします。

php

1 function check_data($check_data){ 2 return $check_data == 'correct' ? array('ok1', 'ok2') : array('error', 'error'); 3 }

ただ、

  • 「ブサイク」が主観的なので、どのように書けばいいのか伝わってこない
  • 「実際には$data3$data4とたくさんある」けど、それがどのような条件で作用するのかわからない

など、このままでは役に立つ回答をしづらい状況にあります。

投稿2019/03/19 00:16

maisumakun

総合スコア145121

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

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

saikin

2019/03/19 08:40

ありがとうございます。失礼致しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問