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

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

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

PHP

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

Q&A

解決済

4回答

1371閲覧

予約システムにおける、定員による選択肢の制御について

waiwai1010

総合スコア16

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

PHP

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

0グッド

0クリップ

投稿2019/01/08 06:14

予約登録時にセレクト項目の表示・非表示を動的に制御したいのですが、そのロジックがまとまらないのでご教授いただけると助かります。

例**************************************************************

 講習(定員9名)を予約する際に、メニューを3種類(A,B,C)の中から選択して登録します。
講習は3人一組で行い、組ごとにメニューは同じになるように受け付けます。

 【講習の組み分けの例】
AAA / BBB / CCC Aが3名、Bが3名、Cが3名で9名
AAA / AAA / BBB Aが6名、Bが3名で9名
AAA / AAA / AAA Aだけで9名

 予約開始時は、メニューの選択肢(HTLMの<select> <option>で定義される)が3つ表示されますが、残席が少なくなると予約できるメニューが絞られてくるので、選択できないメニューは選択肢から除外したいと思います。

  ●予約済みが2名、選択されたメニューはともにA
AA → 3人目の予約時の選択肢はAでもBでもCでも可なのでselect項目は3つ表示される

  ●予約済みが5名、選択されたメニューは以下のとおり
AAAAB → 6人目の予約時の選択肢はAかBのみ。Aで一組、さらにAとBが予約されているので、select項目はAとBのみ表示される

  ●予約済が7名、選択されたメニューは以下のとおり
AAABBBA → 8人目の予約時の選択肢はAのみ。Aで一組、Bで一組、7人目がAを選択しているので、select項目はAのみ表示される


予約済みのメニュー状況により、上記のようなセレクト項目の表示・非表示をPHPで動的に行いたいと思います。
予約は、氏名や選択したメニューと共にデータベースに格納します。

コードに落とすどころか考え方もまとまらず、予約されたメニューの数で総当り的にパターンで制御するくらいしか思いつきません。

シンプルなロジックやヒントなどがありましたらご教授願います。

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答4

0

ベストアンサー

ロジックのヒント程度ですが、
定員9名でメニュー3種類が確定なのであれば
5人目の予約者までは、どのメニューを選択しても問題ありません。

あとは、メニューがたかだか3種類しかありませんので、
それぞれ、商と余りで計算するのが無難ですかね?

例) AAABBBA の場合
A: 商1 余り1
B: 商1 余り0
C: 商0 余り0

商だけA~Cのものを足して2/3埋まっているので、あとはAしかない。
など。

投稿2019/01/08 06:39

salud

総合スコア215

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

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

waiwai1010

2019/01/08 07:36

早速の回答、ありがとうございます。 考え方がまとまっていてわかりやすいです。筋道が見えました。 他の方の評価が高いので、ベストアンサーにさせていただきます。
guest

0

愚直に書いてみた
こういうパズル好き

PHP

1function checkVacantTeam($reserved) { 2 $used_table = 0; 3 $vacant_team = ["A" => false,"B" => false,"C" => false]; 4 foreach (count_chars($reserved, 1) as $i => $val) { 5 if ($val % 3 != 0) { 6 $vacant_team[chr($i)] = true; 7 }; 8 $used_table += ceil($val / 3); 9 } 10 11 if ($used_table < 3) { 12 $vacant_team = ["A" => true,"B" => true,"C" => true]; 13 } 14 return $vacant_team; 15} 16var_dump(checkVacantTeam("AA")); 17var_dump(checkVacantTeam("AAAAB")); 18var_dump(checkVacantTeam("AAABBBA")); 19

投稿2019/01/08 06:58

kopio

総合スコア487

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

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

waiwai1010

2019/01/08 07:18

早速の回答、ありがとうございます。 文字列でチェックする方法、コードまで書いていただいて参考になります。 助かりました。
guest

0

PHP

1/*各講座の申し込み人数を格納する変数*/ 2counter_a=動的に取得 3counter_b=動的に取得 4counter_c=動的に取得 5 6/*申し込みできる講座を決める*/ 7counter_a_bool=true 8counter_b_bool=true 9counter_c_bool=true 10if (counter_a+counter_b>6){ 11 counter_c_bool=false 12}

みたいなイメージ?
if文のパターンはある程度多くなると思います

投稿2019/01/08 06:36

yamato_user

総合スコア2321

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

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

waiwai1010

2019/01/08 07:39

早速の回答、ありがとうございます。 if文のパターンを網羅するのがキモですね。 参考にいたします。
guest

0

n人組の1レクチャーをSlotで表現。
Slotがいくつあるかとか、ユーザ登録を適切にしていけば、末尾にあるようにSlotたちクラス名を答えさせていって重複排除すれば、判明するのかなーと。
思ったより上手くなかった気もするけど書いたのであげとく。

javascript

1class Slot { 2 constructor() { 3 this.candidate = ["A","B","C"] 4 this.contents = "" 5 this.limit = 3 6 this.users = [] 7 } 8 appendable(contentsid) { 9 if(this.users.length >= this.limit) { return false } 10 if(this.contents !== "" && this.contents !== contentsid.contents) { return false } 11 return true 12 } 13 append(contentsid) { 14 if(!this.appendable(contentsid)) { throw new Error() } 15 this.contents = contentsid.contents 16 this.candidate = this.candidate.filter(e => e === this.contents) 17 this.users.push(contentsid.id) 18 } 19 tellCandidate() { return this.users.length === this.limit ? [] : this.candidate } 20} 21// ↓ここから準備 22const slots = [new Slot(), new Slot(), new Slot()]; 23const applications = [{contents:"A", id:"C01"},{contents:"A", id:"C02"},{contents:"A", id:"C03"},{contents:"A", id:"C04"},{contents:"A", id:"C05"},{contents:"B", id:"C06"},{contents:"A", id:"C07"},] 24for(let i = 0; i < applications.length; i++) { 25 for(let j = 0; j < 3; j++) { 26 if(slots[j].appendable(applications[i])) { slots[j].append(applications[i]); break;} 27 } 28} 29// ↑ここまで準備 30const cand = slots.map(e => e.tellCandidate()).reduce((p,c)=> p.concat(c)).filter((e,i,a) => a.indexOf(e) === i); 31console.dir(cand);

投稿2019/01/08 07:06

papinianus

総合スコア12705

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

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

waiwai1010

2019/01/08 08:03

早速の回答、ありがとうございます。 javascriptの書き方も勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問