获取 PHP 中的多维数组的交集

Get intersection of a multi-dimensional array in PHP

起点

我有一个多维数组,如下例:

$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] 以及子数组内部的很多 key/value 。键不是必需的,只有值。关键也是一个计数,而不是一个字符串。

结果我喜欢在这个例子中得到这个小数组。

$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

感谢您的宝贵时间。

你应该可以做到

call_user_func_array('array_intersect', $array_of_arrays)

这会将数组数组的每个元素作为参数传递给 array_intersect,后者将可变数量的数组作为参数,returns 它们的交集。

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 ) 

您可以使用 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.

截至 PHP 5.6+ splat/spread operator can be used to unpack the arguments in a call to array_intersect(). In order to remove the non-numeric keys from the array, pass $array to a call to array_values()

$result = array_intersect(...array_values($array));

请参阅 this playground example 中的演示。