我有一个多数组,如下面的例子。
$array = array (
'role_1' =>
array (
0 => 'value_2',
0 => '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
运行。
感谢您的时间。
答案 0 :(得分:6)
你应该能够做到
call_user_func_array('array_intersect', $array_of_arrays)
这会将数组数组的每个元素作为参数传递给array_intersect
,它将可变数量的数组作为参数并返回它们的交集。
答案 1 :(得分:4)
您可以使用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 :(得分:1)
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 )