回答編集履歴
2
質問文を読み直して書き直し。
    
        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 | 
| 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 | 
            -
             | 
| 41 | 
            +
            function print_result($result) {
         | 
| 10 | 
            -
             | 
| 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
間違って理解していたので訂正。
    
        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 | 
            -
             | 
| 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行は同様にして、 `&&` → `||` ですかね。
         | 
