在PHP中获取多维数组的交集
Posted
技术标签:
【中文标题】在PHP中获取多维数组的交集【英文标题】:Get intersection of a multi-dimensional array in PHP 【发布时间】:2016-06-27 14:13:19 【问题描述】:起点
我有一个多维数组,如下例:
$array = array (
'role_1' =>
array (
0 => 'value_2',
1 => 'value_3',
),
'role_2' =>
array (
0 => 'value_1',
1 => 'value_2',
),
'role_3' =>
array (
0 => 'value_2',
1 => 'value_3',
),
)
目标
我喜欢循环子数组以仅获取交集。该数组是动态创建的,可以有很多子数组role_[x]
,并且子数组内还有很多键/值。键不是必需的,只有值。键也是计数,而不是字符串。
结果我喜欢在这个例子中得到这个小数组。
$array = array( 'value_2' )
子数组的索引“数组名”,如role_1
,在相交后不再相关。结果对我来说重要的是值,每个子数组中只存在这些值。
试试
我曾尝试过使用源代码,但我认为它可能更简单。
$value_stack = array();
$result = array();
$i = 0;
foreach( $settings_ as $role => $values )
foreach( $values as $value )
if( in_array( $value,$value_stack ) || $i === 0 )
$result[ $role ][] = $value;
$value_stack[] = $value;
$i++;
;
这个多数组结果的合并应该在循环中使用array_merge
。
感谢您的宝贵时间。
【问题讨论】:
$temp = $array[0]; for ($i = 1; $i < count($array) -1; $i++) $temp = array_intersect($temp, $array[$i]);
感谢您的快速提示,但在我的测试中总是NULL
。
【参考方案1】:
您可以使用array_intersect 来覆盖动态$data
:
$data = array (
'role_1' =>
array (
0 => 'value_2',
1 => 'value_3',
),
'role_2' =>
array (
0 => 'value_1',
1 => 'value_2',
),
'role_3' =>
array (
0 => 'value_2',
1 => 'value_3',
)
);
$result = call_user_func_array('array_intersect', $data);
call_user_func_array 将有助于将数组的元素作为参数传播到array_intersect
中。
【讨论】:
我接受这个答案 - 这不是第一个答案,而是没有讨论和改进的可靠答案。谢谢。【参考方案2】:你应该可以的
call_user_func_array('array_intersect', $array_of_arrays)
这会将数组数组的每个元素作为参数传递给array_intersect
,array_intersect
将可变数量的数组作为参数并返回它们的交集。
【讨论】:
这个结果总是NULL
。我试过这个。
@bueltge 你也试过call_user_func_array
吗?
是的,抱歉,应该是call_user_func_array
。
对于协议:起初答案是函数call_user_func
。切换到call_user_func_array
真的很有帮助。感谢您的建议!【参考方案3】:
array_intersect为此工作:
$data = array (
'role_1' =>
array (
0 => 'value_2',
1 => 'value_3',
),
'role_2' =>
array (
0 => 'value_1',
1 => 'value_2',
),
'role_3' =>
array (
0 => 'value_2',
1 => 'value_3',
)
);
$result = array_intersect($data['role_1'], $data['role_2'], $data['role_3']);
print_r($result);
结果:
Array ( [0] => value_2 )
【讨论】:
我假设角色的数量是未知的,所以这种调用方式有点不切实际。【参考方案4】:从 php 5.6+ 开始,splat/spread operator 可用于在对 array_intersect()
的调用中解包参数。要从数组中删除非数字键,请将 $array
传递给对 array_values()
的调用。
$result = array_intersect(...array_values($array));
在this playground example 中查看演示。
【讨论】:
以上是关于在PHP中获取多维数组的交集的主要内容,如果未能解决你的问题,请参考以下文章