php在assoc数组中找到公共密钥

时间:2018-02-09 22:53:03

标签: php arrays laravel

我有一个数组

  "a" => array:99 [▶]
  "b" => array:98 [▶]
  "c" => array:98 [▶]
  "d" => array:98 [▶]
  "e" => array:98 [▶]
  "f" => array:98 [▶]
  "g" => array:97 [▶]
  "h" => array:72 [▶]

.....

我需要通过公共密钥过滤数组。数组a有99个项目,h有72个项目,所以我需要根据密钥使这个数组中的所有数组相同72个项目。

数组a:

"Johnson" => "2.94"
"Jordan" => "1.99"
"Bob" => "3.29"
"Bill" => "2.60"
"Jon" => "3.82"

...

数组b:

"Johnson" => "2.94"
"Jordan" => "1.99"
"Bob" => "3.29"
"Bill" => "2.60"
"Steve" => "3.82"

...

所以我基本上希望数组a和b为:

"Johnson" => "2.94"
"Jordan" => "1.99"
"Bob" => "3.29"
"Bill" => "2.60"

因为这些是在这两个数组中一致的键。

我需要根据所有数组中存在的键,使每个数组具有相同的项目。

如果数组是同一个数组的一部分,有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

首先对传递给它的所有子数组应用array_intersect_key一次。您可以使用call_user_func_array:这将为您提供数据中第一项的结果。只有剩余的密钥才会出现在所有其他项目中。

然后再次应用array_intersect_key将数据与array_map对应,以便将每个项目与第一项的结果相交。

假设您的输入存储在名为$data的变量中:

$first = call_user_func_array('array_intersect_key', $data);
$result = array_map(function ($item) use ($first) {
    return array_intersect_key($item, $first);
}, $data);

$result将拥有一个数据副本,其中每个项目都具有相同的键(但当然仍然使用正确的值)。

答案 1 :(得分:0)

我会使用array_reduce&的组合array_intersect_key(@Barmar)。

$array = [  /* Your multidimensional array */  ];

$initial = $array[0];
unset($array[0]);

$consistentValues = array_reduce($array, function($result, $value) {
    return array_intersect_key($result, $value);
}, $initial);