man_list = $man_list; $this->women_list = $women_list; $this->activity_id = $activity_id; } /** * Execute the job. * * @return void */ public function handle() { try { $man = []; $women = []; foreach ($this->man_list as $key => $val) { $man[] = $val['user_id']; $man_info[$val['user_id']] = $val; $man_info[$val['user_id']]['member'] = $val['member']; $man_age[$val['user_id']] = $this->getAge($val['birthday']); } foreach ($this->women_list as $key => $val) { $women[] = $val['user_id']; $women_info[$val['user_id']] = $val; $women_info[$val['user_id']]['member'] = $val['member']; $women_age[$val['user_id']] = $this->getAge($val['birthday']); } $sum = 0; foreach ($man as $key => $val) { $sum += $val; } foreach ($women as $key => $val) { $sum += $val; } $total_array_num = intval(sizeof($women) / 3); $remainder = sizeof($women) % 3; asort($man_age); asort($women_age); $x = 0; for ($i = 1; $i <= $total_array_num;) { foreach ($man_age as $key => $val) { if ($x % 3 == 0) { if ($x >= 3) { if ($i != $total_array_num) { $i++; } } $man_array[$i][$key] = $val; $x = $x + 1; } else { $man_array[$i][$key] = $val; $x = $x + 1; if ($x >= sizeof($man_age)) { $i += 1; break; } } } } $x = 0; for ($i = 1; $i <= $total_array_num;) { foreach ($women_age as $key => $val) { if ($x % 3 == 0) { if ($x >= 3) { if ($i != $total_array_num) { $i++; } } $women_array[$i][$key] = $val; $x = $x + 1; } else { $women_array[$i][$key] = $val; $x = $x + 1; if ($x >= sizeof($women_age)) { $i += 1; break; } } } } $before_women_list = []; $this_man_age = null; $before_women = null; $matach_man_1 = []; foreach ($man_array as $key => $val) { foreach ($val as $val_key => $val_val) { $this_man_age = $val_val; $before_diff_age = 100; foreach ($matach_man_1 as $m2_key => $m2_val) { $before_women_list[$m2_val] = $women_age[$m2_val]; } if ($before_women || $before_women_list) { $math_women_age = array_diff_key($women_array[$key], $before_women_list); } else { $math_women_age = $women_array[$key]; } foreach ($math_women_age as $math_women_key => $math_women_val) { $this_women_age = $math_women_val; $diff_age = abs($this_man_age - $this_women_age); if ($diff_age < $before_diff_age) { $before_diff_age = $diff_age; $before_women = $math_women_key; //$recommend_women_age = $this_women_age; } } if(!in_array($before_women,$matach_man_1)){ $matach_man_1[$val_key] = $before_women; } } } //第二次匹配 $before_women_list = []; $this_man_age = null; $before_women = null; $matach_man_2 = []; foreach ($man_array as $key => $val) { foreach ($val as $val_key => $val_val) { $this_man_age = $val_val; $before_diff_age = 100; $before_women_list[$matach_man_1[$val_key]] = $women_age[$matach_man_1[$val_key]]; foreach ($matach_man_2 as $m2_key => $m2_val) { $before_women_list[$m2_val] = $women_age[$m2_val]; } if ($before_women || $before_women_list) { $math_women_age = array_diff_key($women_array[$key], $before_women_list); } else { $math_women_age = $women_array[$key]; } foreach ($math_women_age as $math_women_key => $math_women_val) { $this_women_age = $math_women_val; $diff_age = abs($this_man_age - $this_women_age); if ($diff_age < $before_diff_age) { $before_diff_age = $diff_age; $before_women = $math_women_key; $recommend_women_age = $this_women_age; } } if (in_array($before_women, $matach_man_2) && sizeof($matach_man_2) < sizeof($women)) { foreach ($women_array[$key] as $x => $y) { $compare_array[] = $x; } $diff_array = array_values(array_diff($compare_array, $matach_man_2)); $compare_array = []; $user_age = $women_age[$diff_array[0]]; $match = 0; $matach_man_2_temp = array_reverse($matach_man_2, true); $matach_man_2_temp = array_intersect_key($matach_man_2_temp, $val); foreach ($matach_man_2_temp as $key_temp => $val_temp) { $man_age_temp = $man_age[$key_temp]; if ($matach_man_1[$key_temp] == $diff_array[0] || $matach_man_2[$key_temp] == $diff_array[0]) { continue; } else { $temp = $matach_man_2[$key_temp]; if ($matach_man_1[$key_temp] == $temp) { continue; } $matach_man_2[$key_temp] = $diff_array[0]; $matach_man_2[$val_key] = $temp; $match = 1; break; } } if (!$match) { $matach_man_2[$val_key] = $before_women; } } else { if(!in_array($before_women,$matach_man_2)) { $matach_man_2[$val_key] = $before_women; } } $before_women_list = []; } } //第三次匹配 $before_women_list = []; $this_man_age = null; $before_women = null; $matach_man_3 = []; foreach ($man_array as $key => $val) { foreach ($val as $val_key => $val_val) { $this_man_age = $val_val; $before_diff_age = 100; $before_women_list[$matach_man_1[$val_key]] = $women_age[$matach_man_1[$val_key]]; $before_women_list[$matach_man_2[$val_key]] = $women_age[$matach_man_2[$val_key]]; foreach ($matach_man_3 as $m3_key => $m3_val) { $before_women_list[$m3_val] = $women_age[$m3_val]; } if ($before_women || $before_women_list) { $math_women_age = array_diff_key($women_array[$key], $before_women_list); } else { $math_women_age = $women_array[$key]; } foreach ($math_women_age as $math_women_key => $math_women_val) { $this_women_age = $math_women_val; $diff_age = abs($this_man_age - $this_women_age); if ($diff_age < $before_diff_age) { $before_diff_age = $diff_age; $before_women = $math_women_key; //$recommend_women_age = $this_women_age; } } if (in_array($before_women, $matach_man_3) && sizeof($matach_man_3) < sizeof($women)) { foreach ($women_array[$key] as $x => $y) { $compare_array[] = $x; } $diff_array = array_values(array_diff($compare_array, $matach_man_3)); $match = 0; $matach_man_3_temp = array_reverse($matach_man_3, true); $matach_man_3_temp = array_intersect_key($matach_man_3_temp, $val); foreach ($matach_man_3_temp as $key_temp => $val_temp) { if ($matach_man_2[$key_temp] == $diff_array[0] || $matach_man_1[$key_temp] == $diff_array[0] || $matach_man_3[$key_temp] == $diff_array[0]) { continue; } else { $temp = $matach_man_3[$key_temp]; if ($matach_man_1[$key_temp] == $temp || $matach_man_2[$key_temp] == $temp) { continue; } $matach_man_3[$key_temp] = $diff_array[0]; $matach_man_3[$val_key] = $temp; $match = 1; break; } } if (!$match) { $matach_man_3[$val_key] = $before_women; } } else { if(!in_array($before_women,$matach_man_3)) { $matach_man_3[$val_key] = $before_women; } } $before_women_list = []; } } foreach ($man_age as $key => $val) { $match_return[$key][] = $matach_man_1[$key]; $match_return[$key][] = $matach_man_2[$key]; $match_return[$key][] = $matach_man_3[$key]; } foreach ($match_return as $key => $val) { foreach ($val as $val_key => $val_val) { $user['send_user'] = $women_info[$val_val]; $user['receive'] = $man_info[$key]; $match_man[$key][$val_key] = $user; } } $return_data = array_values($match_man); Redis::setex('ai:recmd:score:inside:' . $this->activity_id . '_' . $sum, 60*60, json_encode($return_data)); } catch (\Exception $e) { throw new \Exception($e); } } public function getAge($birthday): int { if (empty($birthday)) { return 0; } $age = strtotime($birthday); if ($age === false) { return 0; } list($y1, $m1, $d1) = explode("-", date("Y-m-d", $age)); $now = strtotime("now"); list($y2, $m2, $d2) = explode("-", date("Y-m-d", $now)); $age = $y2 - $y1; if ((int)($m2 . $d2) < (int)($m1 . $d1)) $age -= 1; return $age; } }