回答編集履歴

2

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

2019/10/12 08:01

投稿

tanishi_a
tanishi_a

スコア484

test CHANGED
@@ -1,25 +1,103 @@
1
+ ゴリゴリですが、いちおう書いてみました。
2
+
1
- こうかね
3
+ たぶんやりたいとはこだと思います。
2
4
 
3
5
 
4
6
 
5
7
  ```php
6
8
 
7
- if( $hold==null ? true : $hold==$set['hold']
9
+ function isMatch($args, $set) {
8
10
 
11
+ foreach ($args as $key => $vals) {
12
+
13
+ if (!array_key_exists($key, $set)) {
14
+
15
+ return false;
16
+
17
+ }
18
+
19
+ if (is_array($vals)) {
20
+
21
+ foreach ($vals as $val) {
22
+
23
+ if (!in_array($val, $set[$key], true)) {
24
+
25
+ return false;
26
+
27
+ }
28
+
29
+ }
30
+
31
+ } else {
32
+
33
+ if ($vals !== $set[$key]) {
34
+
35
+ return false;
36
+
37
+ }
38
+
39
+ }
40
+
41
+ }
42
+
43
+ return true;
44
+
45
+ }
46
+
47
+ function get_set_arr($args) {
48
+
49
+ $set_arr = [
50
+
51
+ [ 'key'=>'a', 'hold'=>['cat'], 'use'=>['mew'], 'action_name'=>'honk', 'action_update'=>['animal','cute'] ],
52
+
53
+ [ 'key'=>'b', 'hold'=>['dog'], 'use'=>['bow'], 'action_name'=>'bark', 'action_update'=>['animal','cool'] ],
54
+
55
+ [ 'key'=>'c', 'hold'=>['cow'], 'use'=>['moo'] ],
56
+
9
- ```
57
+ ];
10
58
 
11
59
 
12
60
 
61
+ // 引数をもとに一致する行の配列を返す
62
+
63
+ $result = [];
64
+
65
+ foreach ($set_arr as $set){
66
+
67
+ if (isMatch($args, $set)) {
68
+
69
+ $result[] = $set;
70
+
13
-
71
+ }
72
+
73
+ }
74
+
75
+ return $result;
76
+
77
+ }
14
78
 
15
79
 
16
80
 
17
- ```php
81
+ function print_result($result) {
18
82
 
19
- if( $hold==null ? false : $hold['hold']==$set['hold']
83
+ echo(join(',', array_column($result, 'key')) . "\n");
84
+
85
+ }
86
+
87
+ print_result(get_set_arr(['hold'=>['cat']])); // => a
88
+
89
+ print_result(get_set_arr(['action_name'=>'honk'])); // => a
90
+
91
+ print_result(get_set_arr(['action_name'=>'bark'])); // => b
92
+
93
+ print_result(get_set_arr(['action_update'=>['animal']])); // => a,b
94
+
95
+ print_result(get_set_arr(['hold'=>['cat'], 'action_name'=>'honk'])); // => a
96
+
97
+ print_result(get_set_arr(['hold'=>['cat'], 'action_name'=>'bark'])); // => (なし)
98
+
99
+ print_result(get_set_arr([])); // => a,b,c
100
+
101
+ print_result(get_set_arr(['use'=>['moo']])); // => c
20
102
 
21
103
  ```
22
-
23
-
24
-
25
- 下の3行は同様にして、 `&&` → `||` ですかね。

1

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

2019/10/12 08:01

投稿

tanishi_a
tanishi_a

スコア484

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