142 lines
4.2 KiB
PHP
142 lines
4.2 KiB
PHP
<?php
|
|
define("DUPLICATE_NAME_IN_SAME_GROUP", true);
|
|
|
|
// kiolvassa a választható emberek listáját
|
|
function read_electable_people(string $fname): array
|
|
{
|
|
$s = file_get_contents($fname);
|
|
|
|
// szétszedés csoportnév-csoporttag sorozatra
|
|
$group_name_seq = preg_split("/(\*\*)|(__)/", trim($s), -1, PREG_SPLIT_NO_EMPTY);
|
|
|
|
// csoportok feldolgozása egyenként
|
|
$ep = [];
|
|
for ($i = 0; $i < count($group_name_seq); $i += 2) {
|
|
$group = trim($group_name_seq[$i]); // csoport kiolvasása
|
|
$names = preg_split("/(\n)|(\r\n)/", trim($group_name_seq[$i + 1]), -1, PREG_SPLIT_NO_EMPTY); // nevek a csoportból
|
|
|
|
foreach ($names as $name) {
|
|
if (trim($name) === "") { // üres sorokat átugorja
|
|
continue;
|
|
}
|
|
$new_rec = ["name" => $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; |