public function intersectionCounting($countMin, $groups)
{
$start = 0;
$step = round(100000 / count($groups));
$data = [];
$this->setLog('Получил'.count($groups).' групп. Беру по '.$step.' ID из каждой');
// 1. Проходим по всем группам и берем N значений
foreach($groups as $key => $group)
{
$file = '../storage/app/tempfiles/' . $this->work['id'] . '_' . $group . '.txt';
if (!file_exists($file)) continue;
// Берем N значений ID
$arr = $this->readFileToN($file, $start, $step);
if (!$arr) { unset($groups[$key]); continue; }
$data[$group]['items'] = $arr;
$data[$group]['last_row'] = 0;
$data[$group]['last_id'] = array_pop($arr);
}
$this->setLog('Шаг 0. Взял по '.$step.' строк из '.count($groups).' групп');
while(count($groups) >= $countMin)
{
file_put_contents('data.txt', json_encode($data));
// Находим группу с самым минимальным ID
$min = $this->getMinId($data);
$minIdGroup = $min[0];
$minId = $min[1];
// Берем элементы до минимального ID
$result = [];
foreach($data as $key => $value)
{
$i = 0;
foreach($value['items'] as $k => $val)
{
if ($val > $minId) break;
unset($data[$key]['items'][$k]);
$result[] = $val;
$i++;
}
$data[$key]['last_row'] += $i;
}
// Подсчитываем
$result = array_count_values($result);
arsort($result);
// Пишем найденные пересечения в файл
foreach($result as $key => $value)
{
if ($value < $countMin) break;
file_put_contents($this->file, $key . "\n", FILE_APPEND);
}
// Берем еще N значений в минимальной группе
$file = '../storage/app/tempfiles/' . $this->work['id'] . '_' . $minIdGroup . '.txt';
if (!file_exists($file)) continue;
$arr = $this->getLines($file, $data[$minIdGroup]['last_row'], $step);
// Если группа закончилась
if (!$arr) {
$groups = array_diff($groups, [$minIdGroup]);
unset($data[$minIdGroup]);
$this->setLog('Группа '. $minIdGroup . ' подсчитана');
continue;
}
// Прибавляем N значений к минимальной группе
$data[$minIdGroup]['items'] = array_merge($data[$minIdGroup]['items'], $arr);
$data[$minIdGroup]['last_id'] = array_pop($arr);
}
$this->setLog('Алгоритм подсчета завершен');
}