質問編集履歴

4

質問の趣旨に不要な引数を削除しました

2020/07/08 06:48

投稿

mickymouse
mickymouse

スコア3

test CHANGED
File without changes
test CHANGED
@@ -86,7 +86,9 @@
86
86
 
87
87
  'id' => [
88
88
 
89
- 'a_id' => 10
89
+ 'a_id' => 10
90
+
91
+ ,'b_id' => 20
90
92
 
91
93
  ]
92
94
 
@@ -132,7 +134,7 @@
132
134
 
133
135
  // 実行
134
136
 
135
- $result = validate_required_in_response( 'dennys', 'cake', $response, 'search' );
137
+ $result = validate_required_in_response( 'cake', $response );
136
138
 
137
139
  var_dump($result);
138
140
 
@@ -140,90 +142,78 @@
140
142
 
141
143
  // $responseのリストそれぞれについて、$required_info で指定した型がおかしければfalseを返す
142
144
 
143
- function validate_required_in_response( $shop, $kind, $response, $response_process ){
144
-
145
-
146
-
147
- if ( $response_process === 'search' ) {
148
-
149
-
150
-
151
- if ( $shop === 'dennys' ) {
152
-
153
- if ( $kind === 'cake' ) {
154
-
155
- // 型を指定
156
-
157
- $required_info = [
158
-
159
- 'title' => 'string'
160
-
161
- ,'tag_list' => 'array'
162
-
163
- ,'side' => [
164
-
165
- 'url' => 'string'
166
-
167
- ,'name' => 'string'
168
-
169
- ,'id' => 'integer'
170
-
171
- ]
172
-
173
- ];
174
-
175
- }
176
-
177
- }
178
-
179
-
180
-
181
- elseif ( $shop === 'saizeria' ) {
182
-
183
- if ( $kind === 'drink' ) {
184
-
185
- // 型を指定
186
-
187
- $required_info = [
188
-
189
- 'titles' => [
190
-
191
- 'name' => 'string'
192
-
193
- ,'thumbnails' => 'string'
194
-
195
- ]
196
-
197
- ,'data' => [
198
-
199
- 'id' => [
200
-
201
- 'a_id' => 'integer'
202
-
203
- ]
204
-
205
- ]
206
-
207
- ];
208
-
209
- }
210
-
211
- }
145
+ function validate_required_in_response( $kind, $response ){
146
+
147
+
148
+
149
+ // 引数に応じて型を指定
150
+
151
+ if ( $kind === 'cake' ) {
152
+
153
+ // 型を指定
154
+
155
+ $required_info = [
156
+
157
+ 'title' => 'string'
158
+
159
+ ,'tag_list' => 'array'
160
+
161
+ ,'side' => [
162
+
163
+ 'url' => 'string'
164
+
165
+ ,'name' => 'string'
166
+
167
+ ,'id' => 'integer'
168
+
169
+ ]
170
+
171
+ ];
172
+
173
+ }
174
+
175
+
176
+
177
+ elseif ( $kind === 'drink' ) {
178
+
179
+ // 型を指定
180
+
181
+ $required_info = [
182
+
183
+ 'titles' => [
184
+
185
+ 'name' => 'string'
186
+
187
+ ,'thumbnails' => 'string'
188
+
189
+ ]
190
+
191
+ ,'data' => [
192
+
193
+ 'id' => [
194
+
195
+ 'a_id' => 'integer'
196
+
197
+ ]
198
+
199
+ ]
200
+
201
+ ];
202
+
203
+ }
204
+
205
+
206
+
207
+ // 検証開始
208
+
209
+ $result = true;
210
+
211
+ foreach ( $response as $value ) {
212
+
213
+ // 検証対象$responseに対して、型が$required_infoの指定通りであることを検証したいです
212
214
 
213
215
  }
214
216
 
215
-
216
-
217
- // 検証開始
218
-
219
- $result = true;
220
-
221
- foreach ( $response as $value ) {
222
-
223
- // 検証対象$responseに対して、型が$required_infoの指定通りであることを検証したいです
224
-
225
- }
226
-
227
217
  return $result; // 型がおかしければfalseを返したい
228
218
 
229
219
  }

3

誤字を修正しました

2020/07/08 06:48

投稿

mickymouse
mickymouse

スコア3

test CHANGED
File without changes
test CHANGED
@@ -132,7 +132,7 @@
132
132
 
133
133
  // 実行
134
134
 
135
- $result = validate_required_in_response( 'dennys', 'cake', $response_cakes, 'search' );
135
+ $result = validate_required_in_response( 'dennys', 'cake', $response, 'search' );
136
136
 
137
137
  var_dump($result);
138
138
 

2

編集致しました

2020/07/08 06:44

投稿

mickymouse
mickymouse

スコア3

test CHANGED
File without changes
test CHANGED
@@ -1,231 +1,231 @@
1
- ### 前提・実現したいこと
2
-
3
- プログラミング独学者です。
4
-
5
-
6
-
7
- PHPの多次元連想配列について検証し、指定されたキーが存在しないか、または`null`のときに、`false`を返す関数を作りたいです。
8
-
9
-
10
-
11
- 宜しくお願い致します。
12
-
13
-
14
-
15
- ### 発生している問題・エラーメッセージ
16
-
17
- 多次元的な配列に対する検証方法がわからず質問させて頂きました。
18
-
19
-
20
-
21
- ### 該当のソースコード
22
-
23
- こちらの`$response_cakes`が検証される配列です。
24
-
25
- そして後の`$required_info`は`$response_cakes`になくてはならない必須キーが指定されています。
26
-
27
-
28
-
29
- なので`$required_info`で`['side']['name']`が指定されているとき
30
-
31
- ・`$response_cakes`の`['side']['name']`がなければ`false`を返したい
32
-
33
- ・`$response_cakes`の`['side']['name']`が`null`なら`false`を返したい
34
-
35
- というのが実現したいことになります。
1
+ ###実現したいこと
2
+
3
+ 検証対象`$response`に対して、型が`$required_info`の指定通りあることを検証る関数を作りたいです
4
+
5
+
6
+
7
+ ###問題
8
+
9
+ パターン1やパターン2のように次元の数や構造が異なるのですが、いずれにも対応できるような関数が作れません。
10
+
11
+
12
+
13
+ ###パターン1
14
+
15
+ ```PHP
16
+
17
+ // 検証対象
18
+
19
+ $response = [
20
+
21
+ [
22
+
23
+ 'title' => 'shortcake'
24
+
25
+ ,'tag_list' => ['kids']
26
+
27
+ ,'ranking' => 1
28
+
29
+ ,'side' => [
30
+
31
+ 'url' => 'http...'
32
+
33
+ ,'name' => 'karaage'
34
+
35
+ ,'id' => 10
36
+
37
+ ]
38
+
39
+ ]
40
+
41
+ ];
42
+
43
+
44
+
45
+ // 型を指定
46
+
47
+ $required_info = [
48
+
49
+ 'title' => 'string'
50
+
51
+ ,'tag_list' => 'array'
52
+
53
+ ,'side' => [
54
+
55
+ 'url' => 'string'
56
+
57
+ ,'name' => 'string'
58
+
59
+ ,'id' => 'integer'
60
+
61
+ ]
62
+
63
+ ];
64
+
65
+
66
+
67
+ ```
68
+
69
+ ###パターン2
70
+
71
+ ```PHP
72
+
73
+ // 検証対象
74
+
75
+ $response = [
76
+
77
+ 'titles' => [
78
+
79
+ 'name' => 'coconut juice'
80
+
81
+ ,'thumbnails' => 'http...'
82
+
83
+ ]
84
+
85
+ ,'data' => [
86
+
87
+ 'id' => [
88
+
89
+ 'a_id' => 10
90
+
91
+ ]
92
+
93
+ ]
94
+
95
+ ];
96
+
97
+
98
+
99
+ // 型を指定
100
+
101
+ $required_info = [
102
+
103
+ 'titles' => [
104
+
105
+ 'name' => 'string'
106
+
107
+ ,'thumbnails' => 'string'
108
+
109
+ ]
110
+
111
+ ,'data' => [
112
+
113
+ 'id' => [
114
+
115
+ 'a_id' => 'integer'
116
+
117
+ ]
118
+
119
+ ]
120
+
121
+ ];
122
+
123
+
124
+
125
+ ```
126
+
127
+ ###関数イメージ
128
+
129
+ 作りたい関数のイメージはこちらです。
36
130
 
37
131
  ```php
38
132
 
39
- $response_cakes = [
40
-
41
- [
42
-
43
- 'title' => 'shortcake'
44
-
45
- ,'tag_list' => ['kids']
46
-
47
- ,'ranking' => 1
48
-
49
- ,'side' => [
50
-
51
- 'url' => 'http...'
52
-
53
- ,'name' => 'karaage'
54
-
55
- ,'id' => 10
56
-
57
- ]
58
-
59
- ],
60
-
61
- [
62
-
63
- 'title' => 'montblanc'
64
-
65
- ,'tag_list' => ['kids','chestnut']
66
-
67
- ,'side' => [
68
-
69
- 'url' => 'http...'
70
-
71
- ,'name' => null // ここがnullなのでfalseを返したい
72
-
73
- ,'id' => 10
74
-
75
- ]
76
-
77
- ],
78
-
79
- ];
133
+ // 実行
134
+
135
+ $result = validate_required_in_response( 'dennys', 'cake', $response_cakes, 'search' );
136
+
137
+ var_dump($result);
138
+
139
+
140
+
141
+ // $responseのリストそれぞれについて、$required_info で指定した型がおかしければfalseを返す
142
+
143
+ function validate_required_in_response( $shop, $kind, $response, $response_process ){
144
+
145
+
146
+
147
+ if ( $response_process === 'search' ) {
148
+
149
+
150
+
151
+ if ( $shop === 'dennys' ) {
152
+
153
+ if ( $kind === 'cake' ) {
154
+
155
+ // 型を指定
156
+
157
+ $required_info = [
158
+
159
+ 'title' => 'string'
160
+
161
+ ,'tag_list' => 'array'
162
+
163
+ ,'side' => [
164
+
165
+ 'url' => 'string'
166
+
167
+ ,'name' => 'string'
168
+
169
+ ,'id' => 'integer'
170
+
171
+ ]
172
+
173
+ ];
174
+
175
+ }
176
+
177
+ }
178
+
179
+
180
+
181
+ elseif ( $shop === 'saizeria' ) {
182
+
183
+ if ( $kind === 'drink' ) {
184
+
185
+ // 型を指定
186
+
187
+ $required_info = [
188
+
189
+ 'titles' => [
190
+
191
+ 'name' => 'string'
192
+
193
+ ,'thumbnails' => 'string'
194
+
195
+ ]
196
+
197
+ ,'data' => [
198
+
199
+ 'id' => [
200
+
201
+ 'a_id' => 'integer'
202
+
203
+ ]
204
+
205
+ ]
206
+
207
+ ];
208
+
209
+ }
210
+
211
+ }
212
+
213
+ }
214
+
215
+
216
+
217
+ // 検証開始
218
+
219
+ $result = true;
220
+
221
+ foreach ( $response as $value ) {
222
+
223
+ // 検証対象$responseに対して、型が$required_infoの指定通りであることを検証したいです
224
+
225
+ }
226
+
227
+ return $result; // 型がおかしければfalseを返したい
228
+
229
+ }
80
230
 
81
231
  ```
82
-
83
- そしてこちらが必須キーを示す`$required_info`と、検証する関数になります。
84
-
85
- 検証する関数は自作でこれでは実現できないのでお目汚しかとは思いますが・・・
86
-
87
- 何かご参考になればと思い、お恥ずかしながら掲載させて頂きました。
88
-
89
- ```php
90
-
91
- // 実行
92
-
93
- $result = validate_required_in_response( 'dennys', 'cake', $response_cakes, 'search' );
94
-
95
- var_dump($result);
96
-
97
-
98
-
99
- // $responseのリストそれぞれについて、$required_info の必須キーがなければfalseを返す
100
-
101
- function validate_required_in_response( $shop, $kind, $response, $response_process ){
102
-
103
-
104
-
105
- if ( $response_process === 'search' ) {
106
-
107
-
108
-
109
- if ( $shop === 'dennys' ) {
110
-
111
- if ( $kind === 'cake' ) {
112
-
113
- // 必須キーの指定
114
-
115
- $required_info = [
116
-
117
- 'title'
118
-
119
- ,'tag_list'
120
-
121
- ,'side' => [
122
-
123
- 'url'
124
-
125
- ,'name'
126
-
127
- ,'id'
128
-
129
- ]
130
-
131
- ];
132
-
133
- } elseif ( $kind === 'salad' ) {
134
-
135
- // 同様に他の$kindの場合の必須キーの指定がある
136
-
137
- }
138
-
139
- }
140
-
141
-
142
-
143
- elseif ( $shop === 'saizeria' ) {
144
-
145
- if ( $kind === 'drink' ) {
146
-
147
- // 必須キーの指定
148
-
149
- $required_info = [
150
-
151
- 'titles' => [
152
-
153
- 'name'
154
-
155
- ,'thumbnails'
156
-
157
- ]
158
-
159
- ,'id' => [
160
-
161
- $kind . 'id'
162
-
163
- ]
164
-
165
- ];
166
-
167
- } elseif ( $kind === 'toy' ) {
168
-
169
- // 同様に他の$kindの場合の必須キーの指定がある
170
-
171
- }
172
-
173
- }
174
-
175
- } elseif ( $response_process === 'access' ) {
176
-
177
- // 同様に他の$response_processの場合の必須キーの指定がある
178
-
179
- }
180
-
181
-
182
-
183
- // 検証開始
184
-
185
- $result = true;
186
-
187
- foreach ( $response as $response_info ) {
188
-
189
- foreach ( $response_info as $response_key => $response_val ) {
190
-
191
- foreach ( $required_info as $required_key ) {
192
-
193
- // nullならfalse
194
-
195
- if ( $response_key === $required_key ) {
196
-
197
- if ( $response_val === null ) {
198
-
199
- $result = false; break 3;
200
-
201
- }
202
-
203
- }
204
-
205
- // キーがなければfalse
206
-
207
- if ( isset( $response_info[$required_key] ) ) {
208
-
209
- $result = false; break 3;
210
-
211
- }
212
-
213
- }
214
-
215
- }
216
-
217
- }
218
-
219
- return $result;
220
-
221
- }
222
-
223
- ```
224
-
225
-
226
-
227
- ### 補足情報(FW/ツールのバージョンなど)
228
-
229
-
230
-
231
- PHPは7.2系を使用しています。

1

見にくい部分を削除しました

2020/07/08 06:42

投稿

mickymouse
mickymouse

スコア3

test CHANGED
File without changes
test CHANGED
@@ -224,68 +224,6 @@
224
224
 
225
225
 
226
226
 
227
- ### 試したこと
228
-
229
-
230
-
231
- 多次元的な対応として、`$required_key`が配列のときにもう一度`foreach`をかけようとして以下の部分(7~10行目の部分)に`is_array`を書いたのですが、よくよく考えたら`response`や`$required_info`の次元の数はその都度異なるために、何回`foreach`をかけたらいいかが不定であり、それへの対処が思い浮かばない状態です。
232
-
233
-
234
-
235
- ```php
236
-
237
- // 検証開始
238
-
239
- $result = true;
240
-
241
- foreach ( $response as $response_info ) {
242
-
243
- foreach ( $response_info as $response_key => $response_val ) {
244
-
245
- foreach ( $required_info as $required_key ) {
246
-
247
-
248
-
249
- // 配列ならもう一度foreachをかける
250
-
251
- if ( is_array($required_key) ){
252
-
253
-
254
-
255
- }else{
256
-
257
-
258
-
259
- // nullならfalse
260
-
261
- if( $response_key === $required_key ){
262
-
263
- if( $response_val === null ){
264
-
265
- $result = false; break 3;
266
-
267
- }
268
-
269
- }
270
-
271
- // キーがなければfalse
272
-
273
- if( isset($response_info[$required_key]) ){
274
-
275
- $result = false; break 3;
276
-
277
- }
278
-
279
- }
280
-
281
- }
282
-
283
- }
284
-
285
- }
286
-
287
- ```
288
-
289
227
  ### 補足情報(FW/ツールのバージョンなど)
290
228
 
291
229