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

Posted

技术标签:

【中文标题】在PHP中获取多维数组的交集【英文标题】:Get intersection of a multi-dimensional array in PHP 【发布时间】:2016-06-27 14:13:19 【问题描述】:

起点

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

$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

感谢您的宝贵时间。

【问题讨论】:

$temp = $array[0]; for ($i = 1; $i < count($array) -1; $i++) $temp = array_intersect($temp, $array[$i]); 感谢您的快速提示,但在我的测试中总是NULL 【参考方案1】:

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

你应该可以的

call_user_func_array('array_intersect', $array_of_arrays)

这会将数组数组的每个元素作为参数传递给array_intersectarray_intersect 将可变数量的数组作为参数并返回它们的交集。

【讨论】:

这个结果总是NULL。我试过这个。 @bueltge 你也试过call_user_func_array吗? 是的,抱歉,应该是call_user_func_array 对于协议:起初答案是函数call_user_func。切换到call_user_func_array 真的很有帮助。感谢您的建议!【参考方案3】:

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 ) 

【讨论】:

我假设角色的数量是未知的,所以这种调用方式有点不切实际。【参考方案4】:

php 5.6+ 开始,splat/spread operator 可用于在对 array_intersect() 的调用中解包参数。要从数组中删除非数字键,请将 $array 传递给对 array_values() 的调用。

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

在this playground example 中查看演示。

【讨论】:

以上是关于在PHP中获取多维数组的交集的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中执行数组交集时如何保留多维数组信息?

PHP确定多维数组中数组之间的交集

多维关联数组交集php

如何获得多个多维数组的所有可能交集?

使用php从多维数组中获取子数组

PHP获取两个多维数组的差集