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

9

起点

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

$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]); } - Marc B
谢谢你的快速提示,但是在我的测试中它总是NULL - bueltge
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函数。


array_intersect() 不接受未知的命名参数 - PHP 版本 8 - Smart Boy

7

您应该能够做到

call_user_func_array('array_intersect', $array_of_arrays)

这会将您的数组数组中的每个元素作为参数传递给 array_intersect,它接受可变数量的数组作为参数并返回它们的交集。

这个的结果总是NULL。我已经尝试过了。 - bueltge
@bueltge 你也尝试过使用 call_user_func_array 吗? - deceze
是的,抱歉,应该是call_user_func_array - Rose Kunkel
1
关于协议:刚开始答案是使用call_user_func函数,但转换为call_user_func_array真的非常有帮助。提前感谢! - bueltge

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 ) 

2
我会假设角色数量是未知的,所以这种调用方式有点不切实际。 - deceze

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接