在PHP中获取多个数组的交集

时间:2016-06-27 14:13:20

标签: php arrays intersection

起点

我有一个多数组,如下面的例子。

$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运行。

感谢您的时间。

3 个答案:

答案 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 )