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

回答編集履歴

2

質問文を読み直して書き直し。

2019/10/12 08:01

投稿

tanishi_a
tanishi_a

スコア484

answer CHANGED
@@ -1,13 +1,52 @@
1
+ ゴリゴリですが、いちおう書いてみました。
1
- こうかね
2
+ たぶんやりたいとはこだと思います。
2
3
 
3
4
  ```php
5
+ function isMatch($args, $set) {
6
+ foreach ($args as $key => $vals) {
7
+ if (!array_key_exists($key, $set)) {
8
+ return false;
9
+ }
10
+ if (is_array($vals)) {
11
+ foreach ($vals as $val) {
4
- if( $hold==null ? true : $hold==$set['hold']
12
+ if (!in_array($val, $set[$key], true)) {
13
+ return false;
14
+ }
15
+ }
16
+ } else {
17
+ if ($vals !== $set[$key]) {
18
+ return false;
19
+ }
20
+ }
21
+ }
22
+ return true;
23
+ }
24
+ function get_set_arr($args) {
25
+ $set_arr = [
26
+ [ 'key'=>'a', 'hold'=>['cat'], 'use'=>['mew'], 'action_name'=>'honk', 'action_update'=>['animal','cute'] ],
27
+ [ 'key'=>'b', 'hold'=>['dog'], 'use'=>['bow'], 'action_name'=>'bark', 'action_update'=>['animal','cool'] ],
28
+ [ 'key'=>'c', 'hold'=>['cow'], 'use'=>['moo'] ],
5
- ```
29
+ ];
6
30
 
31
+ // 引数をもとに一致する行の配列を返す
32
+ $result = [];
33
+ foreach ($set_arr as $set){
34
+ if (isMatch($args, $set)) {
35
+ $result[] = $set;
7
-
36
+ }
37
+ }
38
+ return $result;
39
+ }
8
40
 
9
- ```php
41
+ function print_result($result) {
10
- if( $hold==null ? false : $hold['hold']==$set['hold']
42
+ echo(join(',', array_column($result, 'key')) . "\n");
43
+ }
44
+ print_result(get_set_arr(['hold'=>['cat']])); // => a
45
+ print_result(get_set_arr(['action_name'=>'honk'])); // => a
46
+ print_result(get_set_arr(['action_name'=>'bark'])); // => b
47
+ print_result(get_set_arr(['action_update'=>['animal']])); // => a,b
48
+ print_result(get_set_arr(['hold'=>['cat'], 'action_name'=>'honk'])); // => a
49
+ print_result(get_set_arr(['hold'=>['cat'], 'action_name'=>'bark'])); // => (なし)
50
+ print_result(get_set_arr([])); // => a,b,c
51
+ print_result(get_set_arr(['use'=>['moo']])); // => c
11
- ```
52
+ ```
12
-
13
- 下の3行は同様にして、 `&&` → `||` ですかね。

1

間違って理解していたので訂正。

2019/10/12 08:01

投稿

tanishi_a
tanishi_a

スコア484

answer CHANGED
@@ -1,9 +1,13 @@
1
- 三項演算子の `:` の右側は `==` なく、 `=` ではないですか
1
+ こうですかね。
2
2
 
3
+ ```php
4
+ if( $hold==null ? true : $hold==$set['hold']
5
+ ```
3
6
 
7
+
8
+
4
9
  ```php
5
- if( $hold==null ? true : $hold==$set['hold']
10
+ if( $hold==null ? false : $hold['hold']==$set['hold']
6
- && $use==null ? true : $use==$set['use']
7
- && $action_name==null ? true : $action_name==$set['action_name']
8
- && $action_update==null ? true : $action_update==$set['action_update']
9
- ```
11
+ ```
12
+
13
+ 下の3行は同様にして、 `&&` → `||` ですかね。