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

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

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

$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 в петле.

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

 bueltge27 июн. 2016 г., 16:18
Спасибо за быстрый совет, но это всегдаNULL в моих тестах.
 Marc B27 июн. 2016 г., 16:15
$temp = $array[0]; for ($i = 1; $i < count($array) -1; $i++) { $temp = array_intersect($temp, $array[$i]); }

Ответы на вопрос(3)

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

call_user_func_array('array_intersect', $array_of_arrays)

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

 Will Kunkel27 июн. 2016 г., 16:22
Да, извините, это должно было бытьcall_user_func_array.
 deceze27 июн. 2016 г., 16:22
@bueltge Вы также пробовали сcall_user_func_array?
 bueltge27 июн. 2016 г., 16:20
Результатом этого всегдаNULL, Я попробовал это.
 bueltge27 июн. 2016 г., 16:29
Для протокола: сначала ответ был с функциейcall_user_func, Переключатель наcall_user_func_array действительно полезно. Спасибо за совет!

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 ) 
 deceze27 июн. 2016 г., 16:23
Я бы предположил, что количество ролей неизвестно, поэтому этот стиль вызова немного непрактичен.
Решение Вопроса

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

 bueltge27 июн. 2016 г., 16:35
Я принимаю этот ответ - это был не первый ответ, а твердый ответ без обсуждения, улучшений. Спасибо.

Ваш ответ на вопрос