Untitled

mail@pastecode.io avatar
unknown
php
a year ago
3.0 kB
5
Indexable

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('Алгоритм подсчета завершен');
}