获取 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 中的演示。
起点
我有一个多维数组,如下例:
$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 中的演示。