teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記です。

2018/06/08 02:10

投稿

mix-peach
mix-peach

スコア1910

answer CHANGED
@@ -53,4 +53,111 @@
53
53
  ↑これ、pnkとqtyの両方を array_uniqueしていますよね。
54
54
 
55
55
  通常の買い物を考えると、「商品」が異なっても「購入数(数量)」は同じ、は有り得ると思うのですが、
56
- array_uniqueすることで、「購入数(数量)」のデータが欠如する可能性が高そうですが、大丈夫なのでしょうか?
56
+ array_uniqueすることで、「購入数(数量)」のデータが欠如する可能性が高そうですが、大丈夫なのでしょうか?
57
+
58
+
59
+
60
+ コメントからの追記
61
+ ---
62
+
63
+ pnk「123456」qty「3」とpnk「234567」qty「4」を入力した場合、送られてきた値は、
64
+ ↓のような感じ・・部品番号と数量は、「添え字」の同じものが対ですね。
65
+ ```
66
+ //部品番号
67
+ $pnk = [1=> 123456, 2 => 234567];
68
+ //数量
69
+ $qty = [1=> 3, 2 => 4];
70
+ ```
71
+ この$pnkを条件に取得したデータ$rowsは、
72
+ ```
73
+ $rows = [
74
+ 0 => ["partsnumber" => 123456, "description" => '部品A', "unitprice" => 100, "stockqty" => 1000],
75
+ 1 => ["partsnumber" => 234567, "description" => '部品B', "unitprice" => 200, "stockqty" => 2000]
76
+ ];
77
+
78
+ ```
79
+ こんな感じの内容かと、想像します。(partsnumber以外は、カラム名から適当な値を入れています。)
80
+
81
+ $rowsの1レコード($row)には$partsnumberがあり、
82
+ この$partsnumberは、$pnkの配列のに必ずある「値」である、という想定になります。
83
+
84
+ つまり、
85
+ 配列[$pnk]の中から該当する値[$partsnumber]の添え字が分かれば、
86
+ 数量も同じ添え字を使って表示することが出来ます。
87
+
88
+ php初心者さんのようですので、
89
+ 自分で$pnkをループして、$partsnumberと比較し該当の添え字を見つけるのでもいいです。
90
+
91
+ 今のコードを流用するなら、こんな感じでしょうか。
92
+ ```php
93
+ foreach($rows as $row){
94
+ foreach(["partsnumber","description","unitprice","stockqty"] as $val){
95
+ //ここは省略
96
+ }
97
+ foreach($pnk as $key=>$val){
98
+ //同じ部品番号の時に、テーブルを出力する
99
+ if($val == $partsnumber){
100
+  //表示用の数量
101
+ $show_qty = isset($qty[$key]) ? $qty[$key]:"なし";
102
+ print <<<eof
103
+ <th class="th"><div id="sent14_stl">{$partsnumber}</div></th>
104
+ <th class="th"><div id="sent14_stl">{$description}</div></th>
105
+ <th class="th" align="right"><div id="sent14"_stl>{$unitprice}</div></th>
106
+ <th class="th"><div id="sent14_stl">{$stockqty}</div></th>
107
+ <th class="th"><div id="sent14_stl">{$show_qty}</div></th>
108
+ eof;
109
+ print "<tr>\n";
110
+
111
+ //これ以降の$pnkのループは不要なので、処理を抜けます。
112
+ break;
113
+ }
114
+ }
115
+ }
116
+ ```
117
+
118
+ 自分でループさせずとも、「配列から、指定した値と同じ最初のキー(添え字)を探す」array_searchという便利な関数もあります。
119
+ ※結果として「0」と「false」が戻ってくる関数ですので、使い方は[リファレンス](http://php.net/manual/ja/function.array-search.php)をよく読んでくださいね。
120
+
121
+ array_searchを使うなら、こんな感じです。
122
+ ```php
123
+ foreach($rows as $row){
124
+ foreach(["partsnumber","description","unitprice","stockqty"] as $val){
125
+ //ここは省略
126
+ }
127
+ //該当の添え字(キー)を探す。
128
+ $key = array_search($partsnumber, $pnk);
129
+ if($key !== false) { continue; }// 念の為、添え字が見つからなかったら次の処理へ・・
130
+ //表示用の数量
131
+ $show_qty = isset($qty[$key]) ? $qty[$key]:"なし";
132
+ //テーブルを出力する
133
+ print <<<eof
134
+ <th class="th"><div id="sent14_stl">{$partsnumber}</div></th>
135
+ <th class="th"><div id="sent14_stl">{$description}</div></th>
136
+ <th class="th" align="right"><div id="sent14"_stl>{$unitprice}</div></th>
137
+ <th class="th"><div id="sent14_stl">{$stockqty}</div></th>
138
+ <th class="th"><div id="sent14_stl">{$show_qty}</div></th>
139
+ eof;
140
+ print "<tr>\n";
141
+ }
142
+ ```
143
+
144
+ ちなみにですが、上記のコードでは、
145
+ $pnkのカウントが0の場合は、テーブルの出力結果が無いので、$rowsを回して処理をする必要がありません・・・というよりも、そもそも$rowsの取得自体が無駄と言えます。
146
+
147
+ なので、最初の方で、この判別をしてしまうのが効率的です。
148
+
149
+ ```php
150
+ foreach(["pnk","qty"] as $val){
151
+ //中身は省略
152
+ }
153
+
154
+ if(count($pnk) == 0){
155
+ print "<p>入力エラー:部品番号を入力してください</p>\n";
156
+ }else{
157
+ //続きの処理はここから・・・
158
+ try{
159
+ //(SQLサーバーへ接続)
160
+ 。。。以下略
161
+
162
+ }
163
+ ```