具有未知键数的多维数组上的PHP Array_intersect

Posted

技术标签:

【中文标题】具有未知键数的多维数组上的PHP Array_intersect【英文标题】:PHP Array_intersect on multidimensional array with unknown number of keys 【发布时间】:2012-06-08 14:15:36 【问题描述】:

我正在尝试在包含资源(人员)的应用程序中制作高级搜索过滤器。我在 1 个多维数组中得到了所有结果。该应用程序的用户可以搜索人员的职位、技能、工作领域和国家/地区。

我已经完成了查找符合用户给定条件的人的部分。这些结果存储在一个多维数组中。如果用户正在寻找具有特定资源、职位和特定技能的人,则返回值是这样的:

$realfilters = array(2) 
["resourcesWithJobtitle"]=> array(6) 
   [0]=> string(1) "1"
   [1]=> string(2) "48"
   [2]=> string(2) "88"

["resourcesWithSkill"]=> array(9) 
   [0]=> string(1) "4"
   [1]=> string(1) "8"
   [2]=> string(1) "48"
   [3]=> string(2) "50"

当用户还查找工作字段时,它会添加到结果中:

["resourcesWithWorkfield"]=> array(3) 
   [0]=> string(2) "48"
   [1]=> string(2) "96"
   [2]=> string(2) "97"

我需要知道哪些资源满足数组的所有维度,以便显示它们。 (所以在这个例子中,我需要一个只有 1 个值的数组:48)。我想我需要使用array_intersect,但似乎无法正确使用。

【问题讨论】:

【参考方案1】:

一种可能的解决方案:您可以先将extract() $realfilters 数组值应用于变量,然后将array_intersect() 应用于它们。但是这个解决方案只有在没有很多可能的过滤器时才适用。

另一种可能是最好的解决方案是在一个循环中相交,例如:

$res_arr = array_shift($realfilters);
foreach($realfilters as $filter)
     $res_arr = array_intersect($res_arr, $filter);

【讨论】:

似乎可行但不起作用:[code]if(!empty($realfilters)) $resourceIDsThatMatchAllCritera = $realfilters[0]; for ($i = 1; $i 知道了。 $realfilters[0] 不起作用。将其更改为 $realfilters["resourcesWithJobtitle"] 现在可以使用了! 是的。刚刚也注意到了:) 但是我想到了更好的解决方案(以防您不知道密钥): $resourceIDsThatMatchAllCritera = array_shift($realfilters); foreach($realfilters 作为 $filter) $resourceIDsThatMatchAllCritera = array_intersect($resourceIDsThatMatchAllCritera, $filter); @MettinParzinski 顺便问一下,你为什么使用 array_intersect_key?在您的情况下,键只是索引 (0,1,2)... 这是一个错误。这是我的最终代码: if(!empty($realfilters)) $resourceIDsThatMatchAllCritera = $allResourceIDs; foreach ($realfilters as $key => $value) $resourceIDsThatMatchAllCritera = array_intersect($resourceIDsThatMatchAllCritera, $realfilters[$key]); 【参考方案2】:
$intersection = call_user_func_array('array_intersect', $array);

这将为您提供 所有 $array 的子数组中的元素。

编辑- 上面这就像一个写作的捷径:

$intersection = array_intersect($array['a'], $array['b'], ...and so on for all elements...);

也可以使用循环

$intersection = reset($array);
foreach ($array as $subarr) 
    $intersection = array_intersect($intersection, $subarr);

print_r($intersection);

【讨论】:

以上是关于具有未知键数的多维数组上的PHP Array_intersect的主要内容,如果未能解决你的问题,请参考以下文章

PHP从具有关系数据的数组创建多维数组[重复]

多维数组上的 json_encode() - 带有字符串键

具有多维数组的php foreach

PHP PHP - 对多维数组上的键进行排序

PHP递归函数将多维数组转换为xml

将php多维数组输出到html表