public function combineCommonUnits($results, $units_set, $urls_count) { $lemmatizator = new Lemmatizator(); $combined_result = []; $entries_sums = []; //is neccessary for bodies counting $zones = $this->allZones(); $queries = array_keys($results); $counter = new Counter(); foreach ($zones as $zone) { foreach ($units_set as $unit) { foreach ($queries as $query) { if (isset($results[$query][$zone][$unit])) { $combined_result[$zone][$unit]['entries'][] = $results[$query][$zone][$unit]; //count sums for bodies counting if ($zone != 'title') { //titles are not included in bodies counting foreach ($results[$query][$zone][$unit] as $url_num => $entry_count) { $entries_sums[$unit][$query][$url_num] = isset($entries_sums[$unit][$query][$url_num]) ? $entries_sums[$unit][$query][$url_num] + $entry_count : $entry_count; } } //get the averages array only for those sets which has been realy counted for entries $combined_result[$zone][$unit]['average'][] = $counter->getAverage($results[$query][$zone][$unit]); } else { //make the false sets of entries for those which have not been realy counted for entries $combined_result[$zone][$unit]['entries'][] = array_fill(0, $urls_count[$query], 0); } } } } // correct the extra FORMs //======================== //get the list of 'asis' units from units list //use the fact that we need those which have not no FORMs form right after the asis form $asis_to_correct_set = []; foreach ($units_set as $key => $unit) { if (strpos($unit, 'FORMS') === false && (!isset($units_set[$key + 1]) || strpos($units_set[$key + 1], 'FORMS') === false)) { $asis_to_correct_set[] = $unit; } } //get the list of FORMs units that should be corrected //to do this proceed each from asis list with makeUnitNormal function $forms_to_correct_set = []; foreach ($asis_to_correct_set as $asis) { $asis_normal = $lemmatizator->makeUnitNormal($asis); $asis_normal .= " - FORMS"; $forms_to_correct_set[$asis_normal][] = $asis; } //make the array FORMs-unit => all it's asis units foreach (array_keys($forms_to_correct_set) as $asis_normal) { $more_key = array_search($asis_normal, $units_set); array_unshift($forms_to_correct_set[$asis_normal], $units_set[$more_key - 1]); } //prepare factors and divider data for each FORMs-unit (with zone) $correct_factors = []; foreach (array_keys($forms_to_correct_set) as $form) { foreach ($zones as $zone) { $correct_factors[$zone][$form]['divider'] = count($combined_result[$zone][$form]['average']); foreach ($forms_to_correct_set[$form] as $asis) { $correct_factors[$zone][$form]['factors'][$asis] = $correct_factors[$zone][$form]['divider'] - count($combined_result[$zone][$asis]['average']); } } } //not the end of correctness procedure -> to be continued //======================================================= //start the combine averages procedure foreach ($zones as $zone) { foreach ($units_set as $unit) { $entries_flattened = []; foreach ($combined_result[$zone][$unit]['entries'] as $arr) { $entries_flattened = array_merge($entries_flattened, $arr); } // file_put_contents(storage_path("tmp/results.txt"), print_r($combined_result['plain']['КОШКА - FORMS'], true),FILE_APPEND);//FOR TESTING !!! $combined_result[$zone][$unit]['average'] = $counter->getAverage($combined_result[$zone][$unit]['average']); $combined_result[$zone][$unit]['entries'] = $entries_flattened; } } //end of combine averages procedure //================================== //continue the correctness procedure //get the amendment for each zone-FORMSunit foreach (array_keys($forms_to_correct_set) as $form) { foreach ($zones as $zone) { $dividend = 0; foreach ($forms_to_correct_set[$form] as $asis) { $summand = $correct_factors[$zone][$form]['factors'][$asis] * $combined_result[$zone][$asis]['average']; $dividend += $summand; } $correct_factors[$zone][$form]['amendment'] = -1.0 * round($dividend / $correct_factors[$zone][$form]['divider'], 0, PHP_ROUND_HALF_UP); } } //correct the averages in combined result foreach ($correct_factors as $zone => $form_array) { foreach ($form_array as $form => $factors_array) { $combined_result[$zone][$form]['average'] += $factors_array['amendment']; if ($combined_result[$zone][$form]['average'] < 0) { $combined_result[$zone][$form]['average'] = 0; } } } //start the bodies count procedure //================================ $bodies = []; foreach ($entries_sums as $unit => $query_sums) { $bodies[$unit] = []; foreach ($query_sums as $query => $sums) { $bodies[$unit] = array_merge($bodies[$unit], $sums); } $bodies[$unit] = $counter->getAverage($bodies[$unit]); // $body_amendment = 0; foreach ($zones as $zone) { if ($zone != 'title') { // $bodies[$unit] = $bodies[$unit]; $bodies[$unit] = $bodies[$unit] - $combined_result[$zone][$unit]['average']; } } //get the average amendment from all zones foreach ($correct_factors as $zone => $form_array) { if (isset($correct_factors[$zone][$unit]) && $zone != 'title') { $body_amendment = isset($body_amendment) ? $body_amendment += $correct_factors[$zone][$unit]['amendment'] : $correct_factors[$zone][$unit]['amendment']; } } // $body_amendment = $body_amendment / 4.0; if (isset($body_amendment)) { $body_amendment = round($body_amendment, 0, PHP_ROUND_HALF_UP); //average for 4 zones w/o title $bodies[$unit] += $body_amendment; if ($bodies[$unit] < 0) { $bodies[$unit] = 0; } } //correct the body amount with average amendment } return [$combined_result, $bodies]; }
public function substract($rest, $unit) { $lemmatizator = new Lemmatizator(); $norm_rest = str_replace(" - FORMS", "", $lemmatizator->makeUnitNormal($rest)); $norm_unit = str_replace(" - FORMS", "", $lemmatizator->makeUnitNormal($unit)); $rest_arr_normals = array_diff(explode(" ", $norm_rest), explode(" ", $norm_unit)); $rest_arr = array_combine(explode(" ", $norm_rest), explode(" ", $rest)); $new_rest = ""; foreach ($rest_arr_normals as $norm) { $new_rest .= " " . $rest_arr[$norm]; } return $new_rest; }