PHP过滤器多维关联数组的键和值

时间:2018-12-04 17:13:10

标签: php arrays

我正在尝试编写一个函数来过滤多维关联数组,其中查询数组必须与所有键和所有值都匹配。

例如,我需要对此进行过滤:

$data = array(
       array("id"=>"1","color"=>"Red","size" => "L"),
       array("id"=>"2","color"=>"Blue","size"  => "L"),
       array("id"=>"3","color"=>"Blue","size"  => "L")
    );

和我需要匹配的参数以类似数组的形式提供:

array("color"=>"Red","size" => "L")

所以我应该从第一个数组中获取

array("id"=>"1","color"=>"Red","size" => "L")

这是唯一与所有键名称和值完全匹配的键。

我有个想法要迭代数组并比较每个值,例如:

$value['color'] == $query['color'] && $value['size'] == $query['size'] . . .

但是我不认为是最好的,我想写一个不带硬编码数组键的通用函数。 我该怎么办?

3 个答案:

答案 0 :(得分:0)

$data = array(
   array("id"=>"1","color"=>"Red","size" => "L"),
   array("id"=>"2","color"=>"Blue","size"  => "L"),
   array("id"=>"3","color"=>"Blue","size"  => "L")
);
$match = array("color"=>"Red","size" => "L");
$data = array_filter($data, function($input) use ($match) {
  return $input["color"] === $match["color"] && $input["size"] === $match["size"];
});

类似的东西应该起作用

答案 1 :(得分:0)

为什么不使用数学家集合论和交集?用Php数组表示,这意味着您可以使用array_intersect从两个数组中获取相等的值。

public function filter(array $query, array $data) : array
{
    $result = array_filter($data, function ($item) use ($query) 
    {
        $valueInters = array_intersect($item,$query);
        $keyIntersec = array_intersect(array_flip($valueInters),array_flip($query));
        return ( count($valueInters) == count($query) && (count($keyIntersec)) == count($query));        
    });
    return $result;
}

简要说明:  该函数迭代需要过滤的数组的数组。每个子数组都与查询数组相交,结果是只有两个数组的值相似的数组。然后,如果最后一个的长度与查询的长度相同,则意味着您完全匹配了查询参数中的所有值。

由于您要确保匹配的值对应于同一键,因此将查询数组和要过滤的数组都翻转,然后执行与以前相同的操作。

没有任何内容经过硬编码,这是一种通用代码,您可以仅使用不合格的数据进行过滤和查询。

答案 2 :(得分:0)

这与其他答案的方向几乎相同,但是我认为使用>>> d = {'middle': "middle is:\U0001f004."} >>> d {'middle': 'middle is:.'} >>> print(ascii(d)) {'middle': 'middle is:\U0001f004.'} 可以大大简化回调。基本上,只需将array_diff_assoc中的每一行与目标数组进行比较。如果目标数组中的所有键值对都包含在该行中,则差异将为空。

$data