<?php
function translitUa($str) {
$array = [
//'&'=>'ta',
//'%'=>'',
//'\''=>'',
'Зг'=>'Zgh',
'зг'=>'zgh',
'А'=>'A','а'=>'a',
'Б'=>'B','б'=>'b',
'В'=>'V','в'=>'v',
'Г'=>'H','г'=>'h',
'Ґ'=>'G','ґ'=>'g',
'Д'=>'D','д'=>'d',
'Е'=>'E','е'=>'e',
'Є'=>'Ye','є'=>'ie',
'Ж'=>'Zh','ж'=>'zh',
'З'=>'Z','з'=>'z',
'И'=>'Y','и'=>'y',
'І'=>'I','і'=>'i',
'Ї'=>'Yi','ї'=>'i',
'Й'=>'Y','й'=>'i',
'К'=>'K','к'=>'k',
'Л'=>'L','л'=>'l',
'М'=>'M','м'=>'m',
'Н'=>'N','н'=>'n',
'О'=>'O','о'=>'o',
'П'=>'P','п'=>'p',
'Р'=>'R','р'=>'r',
'С'=>'S','с'=>'s',
'Т'=>'T','т'=>'t',
'У'=>'U','у'=>'u',
'Ф'=>'F','ф'=>'f',
'Х'=>'Kh','х'=>'kh',
'Ц'=>'Ts','ц'=>'ts',
'Ч'=>'Ch','ч'=>'ch',
'Ш'=>'Sh','ш'=>'sh',
'Щ'=>'Shch','щ'=>'shch',
'Ь'=>'','ь'=>'',
'Ю'=>'Yu','ю'=>'iu',
'Я'=>'Ya','я'=>'ia'
];
return strtr($str,$array);
}
function wordcombos($words) {
if ( count($words) <= 1 ) {
$result = $words;
} else {
$result = array();
for ( $i = 0; $i < count($words); ++$i ) {
$firstword = $words[$i];
$remainingwords = array();
for ( $j = 0; $j < count($words); ++$j ) {
if ( $i <> $j ) $remainingwords[] = $words[$j];
}
$combos = wordcombos($remainingwords);
for ( $j = 0; $j < count($combos); ++$j ) {
$result[] = $firstword . ' ' . $combos[$j];
}
}
}
return $result;
}
function wordsArray($words, $data, $array = []) {
if ($words === []) {
return $array;
}
$word = array_shift($words);
$subArray = wordsArray($words, $data, $array);
if ($subArray === []) {
$array[metaphone(translitUa($word))]['@data'] = $data;
} else {
$array[metaphone(translitUa($word))] = $subArray;
}
return $array;
}
$query = 'Який розклад маршруток "Бородянка - Макарів"? І яка ціна?';
$queryWords = explode(' ', $query);
//var_dump($words);
$matches = [
'розклад маршруток київ' => 'ось розклад маршруток київ',
'розклад автобусів київ' => 'ось розклад маршруток київ',
'розклад маршруток клавдієво' => 'ось розклад маршруток клавдієво',
'розклад автобусів клавдієво' => 'ось розклад маршруток клавдієво',
'розклад маршруток макарів' => 'ось розклад маршруток макарів',
'розклад автобусів макарів' => 'ось розклад маршруток макарів',
'розклад макарів' => 'ось розклад маршруток макарів',
'розклад електричок київ' => 'ось розклад електричок київ',
'розклад електричок святошин' => 'ось розклад електричок київ',
];
function generateArray($matches) {
$array = [];
foreach ($matches as $keywords => $match) {
$keywordsArray = explode(' ', $keywords);
$combinations = wordcombos($keywordsArray);
foreach ($combinations as $combination) {
$words = explode(' ', $combination);
$array = array_merge_recursive($array, wordsArray($words, $match));
}
}
return $array;
}
$array = generateArray($matches);
foreach ($queryWords as $word) {
$wordMeta = metaphone(translitUa($word));
foreach ($array as $key => $value) {
if (levenshtein($wordMeta, $key) < 2) {
$array = $array[$key];
//var_dump($word . ' - ' . $wordMeta, $array);
break;
}
}
}
if (isset($array['@data'])) {
var_dump($array['@data']);
}
preferences:
36.52 ms | 402 KiB | 5 Q