Работа с array_intersect в PHP

237
01 июля 2018, 18:00

Есть бесконечное число 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 штук. Нужно вычислять тех пользователей которые уже состоят в двух беседах или в трех беседах и т.д.

Answer 1

Слейте все массивы в один, отсортируйте и найдите стоящие рядом одинаковые идентификаторы

$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);
READ ALSO
Ajax вывести результат php-скрипта в div

Ajax вывести результат php-скрипта в div

Имеется форма, в которую пользователь вводит текстовое сообщение, затем оно обрабатывается в php и пользователь получает ответЭто мой первый...

334
Кодировка php на сайте

Кодировка php на сайте

Есть сайт ссылка на нем используется следующий код:

239
URL-оповещения Free-kassa

URL-оповещения Free-kassa

Оплатил товар на сайте, зашел в логи, вижу: запрос:

347
Sql injection Update query как изменить данные

Sql injection Update query как изменить данные

Имеется запрос который вытаскивает данные пользователя с БДСам запрос (SQLMAP):

253