Есть бесконечное число N массивов в массиве. В этих массивах также есть неопределённое количество элементов. Общий массив выглядит примерно вот так:
$users = [
0 => [3,5,1,4],
1 => [9,2,7,0,1],
2 => [11,6,8,1]
];
Мне нужно вытащить общие элементы в массиве. (В данном случае это 1) Также нужно вытащить общий элемент в такой ситуации:
$users = [
0 => [3,5,1,4],
1 => [9,2,7,0,1],
2 => [11,6,8,13]
];
Виден общий элемент между первыми двумя ключами (Должно выдать также 1)
array_intersect тут не помошник... (Так как аргументы не двумерные массивы) Приведу пример для чего это нужно... Есть высоконагруженные беседы в вк. Их около 600 штук. Нужно вычислять тех пользователей которые уже состоят в двух беседах или в трех беседах и т.д.
Слейте все массивы в один, отсортируйте и найдите стоящие рядом одинаковые идентификаторы
$data = [];
foreach ($users as $user)
$data = array_merge($data, $user);
sort($data);
$prev = null;
$cnt = 1;
$dups = [];
foreach($data as $idx) {
if (isset($prev) && $idx == $prev) {
$cnt++;
if ($cnt === 2)
$dups[] = $idx;
} else {
$cnt = 1;
$prev = $idx;
}
}
var_dump($dups);
Update
Или можно вызвать функцию array_count_values() для общего массива и посмотреть для каких ключей значение будет больше 1. Какой способ быстрее - нужно проверять
$data = [];
foreach ($users as $user)
$data = array_merge($data, $user);
$counts = array_count_values($data);
$dups = [];
foreach($counts as $key => $val) {
if ($val > 1)
$dups[] = $key;
}
var_dump($dups);
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости