Получить пересечение нескольких массивов в переполнении стека

Отправная точка

У меня есть несколько массивов, как в следующем примере.

$array = array (
'role_1' =>
array (
0 => 'value_2',
0 => '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 в петле.

Спасибо за ваше время.

4

Решение

Ты можешь использовать 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,

3

Другие решения

Вы должны быть в состоянии сделать

call_user_func_array('array_intersect', $array_of_arrays)

Это передаст каждый элемент вашего массива в качестве аргумента array_intersect, который принимает переменное число массивов в качестве аргументов и возвращает их пересечение.

6

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 )
1
По вопросам рекламы [email protected]