function SearchPerson($texts, $ex_id = 0, $delta = -1, $myselect = null) { $res = array(); $persones_exact = array(); $persones_part = array(); $persones_approx = array(); $sortarray = array(); if (!$myselect) { $myselect = array(); $sql = "SELECT persones.ID as ID,\n persones.RusName as RusName,\n persones.OriginalName as OriginalName\n FROM persones"; $result = mysql_query($sql); while ($result && ($field = mysql_fetch_assoc($result))) { $myselect[] = $field; } } foreach ($texts as $text) { $ltext = strlen($text); $ei = 0; $pi = 0; $ai = 0; $delta = $delta != -1 ? $delta : limit_lev($ltext); reset($myselect); foreach ($myselect as $field) { $lev_n = levenshtein($field["RusName"], $text, 2, 1, 1); $lev_on = levenshtein($field["OriginalName"], $text, 2, 1, 1); $pos_n = strpos(strtolower($field["RusName"]), strtolower($text)); $pos_on = strpos(strtolower($field["OriginalName"]), strtolower($text)); $d_n = abs(strlen($field["RusName"]) - $ltext); $d_on = abs(strlen($field["OriginalName"]) - $ltext); $l_n = min($ltext, strlen($field["RusName"])); $l_on = min($ltext, strlen($field["OriginalName"])); if ($lev_n == 0 || $lev_on == 0) { $persones_exact[$ei] = $field; $ei++; } else { if ($ltext > 1 && (is_integer($pos_n) || is_integer($pos_on))) { $persones_part[$pi] = $field; $pi++; } elseif ($lev_n < $l_n * $delta + $d_n || $lev_on < $l_on * $delta + $d_on && (compare_substring($text, $field["RusName"]) <= $delta * $ltext || compare_substring($text, $field["OriginalName"]) <= $delta * $ltext)) { $sortarray[$ai] = min($lev_on - $d_on, $lev_n - $d_n); $persones_approx[$ai] = $field; $ai++; } } } } array_multisort($sortarray, SORT_ASC, $persones_approx); $c = count($persones_approx); for ($i = 10; $i < $c; $i++) { array_pop($persones_approx); } $persones = array(); $persones[$ex_id] = 1; $res["persones_exact"] = array(); $res["persones_part"] = array(); $res["persones_approx"] = array(); foreach ($persones_exact as $person) { if (empty($persones[$person["ID"]])) { $persones[$person["ID"]] = 1; $res["persones_exact"][] = $person; } } foreach ($persones_part as $person) { if (empty($persones[$person["ID"]])) { $persones[$person["ID"]] = 1; $res["persones_part"][] = $person; } } foreach ($persones_approx as $person) { if (empty($persones[$person["ID"]])) { $persones[$person["ID"]] = 1; $res["persones_approx"][] = $person; } } $res["pcount"] = count($res["persones_approx"]) + count($res["persones_part"]) + count($res["persones_exact"]); return $res; }
$pos_n = strpos(strtolower($field["RusName"]), strtolower($text)); $pos_on = strpos(strtolower($field["OriginalName"]), strtolower($text)); $d_n = abs(strlen($field["RusName"]) - $ltext); $d_on = abs(strlen($field["OriginalName"]) - $ltext); $l_n = min($ltext, strlen($field["RusName"])); $l_on = min($ltext, strlen($field["OriginalName"])); if ($lev_n == 0 || $lev_on == 0) { $persones_exact[$ei] = $field; $ei++; $pcount++; } else { if ($ltext > 1 && (is_integer($pos_n) || is_integer($pos_on))) { $persones_part[$pi] = $field; $pi++; $pcount++; } elseif ($lev_n < $l_n * limit_lev($ltext) + $d_n || $lev_on < $l_on * limit_lev($ltext) + $d_on) { $sortarray[$ai] = min($lev_on - $d_on, $lev_n - $d_n); $persones_approx[$ai] = $field; $ai++; $pcount++; } } } array_multisort($sortarray, SORT_ASC, $persones_approx); $c = count($persones_approx); for ($i = 20; $i < $c; $i++) { array_pop($persones_approx); $pcount--; } $_RESULT["persones_exact"] = $persones_exact; $_RESULT["persones_part"] = $persones_part;