Untitled
unknown
php
a year ago
3.0 kB
4
Indexable
Never
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('Алгоритм подсчета завершен'); }