我正在尝试编写一个函数来过滤多维关联数组,其中查询数组必须与所有键和所有值都匹配。
例如,我需要对此进行过滤:
$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'] . . .
但是我不认为是最好的,我想写一个不带硬编码数组键的通用函数。 我该怎么办?
答案 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