【问题标题】:Filter array rows by matching one or more key-value pairs in associative array通过匹配关联数组中的一个或多个键值对来过滤数组行
【发布时间】:2022-01-17 04:40:59
【问题描述】:

假设,

$data = array(
   array('id' => 1, 'user_id' => 1, 'assignment_id' => 1, 'grade' => 90),
   array('id' => 2, 'user_id' => 3, 'assignment_id' => 2, 'grade' => 85),
   array('id' => 3, 'user_id' => 5, 'assignment_id' => 5, 'grade' => 66),
);

现在我想过滤如下行:

$rules = array(
    'user_id' => 5,
    'assignment_id' => 5
);

这应该返回$data[2] 处的行。

$rules = array(
    'user_id' => 3,
    'assignment_id' => 2,
    'grade' => 85
);

将返回$data[1]

这里keys 的顺序在$data 元素和$rules 中可能不同。

我尝试使用 array_intersect,但这对我不起作用。

【问题讨论】:

    标签: php multidimensional-array filtering array-filter array-intersect


    【解决方案1】:

    如果您只需要返回$data 中符合过滤条件的元素列表,您可以使用array_filter()array_intersect_assoc() 的组合来完成这项工作:

    // build an array of your filtering criteria
    $filter_array = array(
       'user_id' => 3,
       'assignment_id' => 5
    );
    
    // filter the array
    $filtered_array = array_filter($data, function ($val_array) use ($filter_array) {
        $intersection = array_intersect_assoc($val_array, $filter_array);
        return (count($intersection)) === count($filter_array);
    });
    

    请注意,您需要 PHP >= 5.3.0 才能使用所示的匿名函数。

    【讨论】:

      【解决方案2】:

      这是一种更现代、更优雅的方法。

      使用箭头函数语法允许$rules 进入自定义函数的范围。如果通过每个遇到的行关联过滤规则数组后没有剩余元素,则所有规则都满足。

      代码:(Demo)

      $data = [
         ['id' => 1, 'user_id' => 1, 'assignment_id' => 1, 'grade' => 90],
         ['id' => 2, 'user_id' => 3, 'assignment_id' => 2, 'grade' => 85],
         ['id' => 3, 'user_id' => 5, 'assignment_id' => 5, 'grade' => 66],
      ];
      
      $rules = ['user_id' => 3, 'assignment_id' => 2];
      
      var_export(
          array_filter($data, fn($row) => !array_diff_assoc($rules, $row))
      );
      

      输出:

      array (
        1 => 
        array (
          'id' => 2,
          'user_id' => 3,
          'assignment_id' => 2,
          'grade' => 85,
        ),
      )
      

      【讨论】:

        猜你喜欢
        • 2021-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-28
        相关资源
        最近更新 更多