$name, "group" => $group]; if (DUPLICATE_NAME_IN_SAME_GROUP || !in_array($new_rec, $ep)) { $ep[] = $new_rec; } } } return $ep; } define("MINIMUM_NEEDLE_LENGTH", 3); define("HIDE_GROUP_OF_NON_DUPLICATES", true); // keresés a nevek között function search_in_names(array $records, string $needle, string $group = ""): array { // keresés $needle = trim($needle); if (strlen($needle) < MINIMUM_NEEDLE_LENGTH) { return []; } $exact_match = []; $hitpos_array = []; $filter = function (array $var) use (&$hitpos_array, &$exact_match, $needle, $group): bool { // ha a csoporton belül keres if ($group !== "" && $var["group"] !== $group) { return false; } $hitpos = stripos($var["name"], $needle); // ha van egyezés... if ($hitpos !== false) { $hitpos_array[] = $hitpos; // megvizsgálja, hogy exact egyezés van-e? $exact_match[] = $var["name"] === $needle; } return $hitpos !== false; }; $filter_res = array_values(array_filter($records, $filter)); if (count($filter_res) > 0) { for ($i = 0; $i < count($filter_res); $i++) { $filter_res[$i]["hitpos"] = $hitpos_array[$i]; $filter_res[$i]["exact_match"] = $exact_match[$i]; $filter_res[$i]["duplicate"] = false; } } if (HIDE_GROUP_OF_NON_DUPLICATES) { // nevek rendezése hossz szerint (substr gyorsítása n*(n-1)-ről (n-1)+(n-2)+(n-3)... vizsgálatra) usort($filter_res, fn($a, $b) => strlen($a["name"]) - strlen($b["name"])); // ha a név nem szerepel több, mint egyszer, akkor a csoportot törli (security reasons) for ($i = 0; $i < count($filter_res); $i++) { if ($filter_res[$i]["duplicate"]) { continue; } $name_needle = $filter_res[$i]["name"]; // név, amit keresünk a többiben $is_duplicate = false; for ($j = $i + 1; $j < count($filter_res); $j++) { // ha van találat, akkor kiugrunk a keresésből if (stripos($filter_res[$j]["name"], $name_needle) !== false) { $filter_res[$j]["duplicate"] = true; $is_duplicate = true; break; } } $filter_res[$i]["duplicate"] = $is_duplicate; } // csoport törlése azokból a nevekből, amikből nem szerepel több for ($i = 0; $i < count($filter_res); $i++) { if (!$filter_res[$i]["duplicate"]) { $filter_res[$i]["group"] = ""; } } } // rendezés abc-rendbe usort($filter_res, fn($a, $b) => $a["name"] > $b["name"]); return $filter_res; } // -------------------------------- define("ELECTABLE_PEOPLE_DATABASE", "data/electable_people_test.md"); $action = json_decode($_POST["action"]) ?? "none"; $res = ""; switch ($action) { case "search": { $needle = json_decode($_POST["needle"]); $group = json_decode($_POST["group"]); $p = read_electable_people(ELECTABLE_PEOPLE_DATABASE); $hits = search_in_names($p, $needle, $group); $res = $hits; } break; case "none": break; } echo json_encode($res); //$p = read_electable_people("data/electable_people_test.md"); return;