我有一个数组
"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"
因为这些是在这两个数组中一致的键。
我需要根据所有数组中存在的键,使每个数组具有相同的项目。
如果数组是同一个数组的一部分,有没有办法做到这一点?
答案 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);