Как найти слова с только / более указанными буквами, используя preg_grep в массиве? - PullRequest
0 голосов
/ 22 мая 2018

У меня есть пример функции для поиска слов из массива с указанными буквами:

public static function getWords($words, $specifed_letters) 
{ 
    $pattern = is_array($specifed_letters) ? '/[' . implode("", 
    $specifed_letters) . ']/u' : '/[' .$specifed_letters. ']/u';
    $result = preg_grep($pattern, $array_words);
    return $result;
}

Пример использования:

$words = ["apple", "sample", "app", "тоҷик", "отабек", "баҳодурбек"];
$result = getWords($words, $letters = ['l', 's']);

В этом примере будут возвращаться слова: apple, sample.Потому что в этих словах есть буквы "l" или "s".

Как я могу искать слова, в которых есть все указанные буквы в слове?

Например, если я добавлюк указанным буквам "app" тогда из массива слов должны быть возвращены слова: app, apple.

И как искать слова с только указанными буквами .Например, я напишу слово "app" в shuffled варианте "pap".И как я могу получить на результат только слово "app" без "apple"?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Вы можете разделить символы слова на массив и зациклить их, а также разделить символы из указанной строки в массив.

Если один из символов слова встречается в символах из указанного массива строк,удалить символ из обоих массивов.

После завершения цикла убедитесь, что в символах из указанного массива строк больше не осталось символов.

$words = ["apple", "sample", "app", "justappgg", "тоҷик", "отабек", "баҳодурбек", "APELCIN", "API", "pap"];
mb_internal_encoding("UTF-8");

foreach ($words as $word) {
    $wordSplit = preg_split('//u', $word, null, PREG_SPLIT_NO_EMPTY);
    $strSplit = preg_split('//u', $str, null, PREG_SPLIT_NO_EMPTY);
    $wordSplit = array_filter($wordSplit, function ($x) use (&$strSplit) {
        if (in_array(strtolower($x), array_map('strtolower', $strSplit), true)) {
            $pos = array_search(strtolower($x), array_map('strtolower', $strSplit), true);
            unset($strSplit[$pos]);
            return false;
        }
        return true;
    });
    if (count($strSplit) === 0) {
        echo "$word contains all letters of $str" . PHP_EOL;
    }
}

Demo

0 голосов
/ 22 мая 2018

Вы можете использовать preg_grep.
Если вы вставите буквы внутри [] в шаблоне регулярных выражений, он должен найти букву и вернуть элемент, если найден.

$words = ["apple", "sample", "app", "тоҷик", "отабек", "баҳодурбек"];
$letters = ['l', 's'];

$res = preg_grep("/[" . implode("", $letters) . "]/", $words); // pattern = "/[ls]/"
var_dump($res);

https://3v4l.org/UZTYZ

РЕДАКТИРОВАТЬ
Но эта часть вашего вопроса: А как искать слова только с указанными буквами.Например, я напишу слово «app» в случайном варианте «pap».И как я могу получить в результате только слово «приложение» без «яблока»?
Является ли полная противоположность первой части, где вы хотели очень свободный поиск.
Ожидаете ли вы один свободный и один точныймассив результатов?


Точное совпадение можно выполнить, разделив строки и отсортировав буквы (в массиве).
Затем проверьте, совпадают ли массивы друг с другом.Если они это сделают, то это точное совпадение.

$words = ["apple", "sample", "app", "тоҷик", "отабек", "баҳодурбек"]; 
$find = "pap";

$find = str_split($find);
sort($find);
foreach($words as $word){
    $temp = str_split($word);
    sort($temp);
    if($temp == $find){
        echo "match " . $word . "\n";
    }
}

https://3v4l.org/WbTUK

...