Reputation: 2402
I have a multidimensional array, like the follow 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',
),
)
I like to loop about the sub-arrays to get only the intersection. The array was created dynamically, can have a lot of sub-arrays role_[x]
and also a lot of key/value inside the sub-arrays. The key is not necessary, only the value. The key is also a count, not a string.
As a result, I like to get in this example this small array.
$array = array( 'value_2' )
The index, "the array-name", like role_1
of the sub-arrays is not more relevant after intersection. Important for me in the result is the values, only the values there are existed in each sub-array.
I had tried with the source, but I think it is possible much simpler.
$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++;
};
The merge of this multi array result should run with a array_merge
in a loop.
Upvotes: 9
Views: 5591
Reputation: 8297
As of PHP 5.6+ the 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));
See a demonstration in this playground example.
Upvotes: 0
Reputation: 8077
You can use array_intersect to cover the dynamic $data
as such:
$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 will help spread the elements of your array as parameters inside array_intersect
.
Upvotes: 12
Reputation: 3268
You should be able to do
call_user_func_array('array_intersect', $array_of_arrays)
This will pass each element of your array of arrays as an argument to array_intersect
, which takes a variable number of arrays as arguments and returns their intersection.
Upvotes: 7
Reputation: 2058
array_intersect work for this:
$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);
result :
Array ( [0] => value_2 )
Upvotes: 1