我有一个多维数组,如下例:
$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
运行。
感谢您的宝贵时间。
您可以使用 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
中。
你应该能够做到
call_user_func_array('array_intersect', $array_of_arrays)
这会将数组数组的每个元素作为参数传递给
array_intersect
,后者接受可变数量的数组作为参数并返回它们的交集。
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 )
从 PHP 5.6+ 开始,splat/spread 运算符可用于在调用
array_intersect()
时解压参数。为了从数组中删除非数字键,请将 $array
传递给对 array_values()
的调用。
$result = array_intersect(...array_values($array));
请参阅这个游乐场示例中的演示。