在 PHP 中获取多维数组的交集[重复]

问题描述 投票:0回答:4

起点

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

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

感谢您的宝贵时间。

php arrays multidimensional-array intersection
4个回答
12
投票

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


7
投票

你应该能够做到

call_user_func_array('array_intersect', $array_of_arrays)

这会将数组数组的每个元素作为参数传递给

array_intersect
,后者接受可变数量的数组作为参数并返回它们的交集。


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 ) 

0
投票

从 PHP 5.6+ 开始,splat/spread 运算符可用于在调用

array_intersect()
时解压参数。为了从数组中删除非数字键,请将
$array
传递给对
array_values()
的调用。

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

请参阅这个游乐场示例中的演示。

© www.soinside.com 2019 - 2024. All rights reserved.