Удалить повторяющиеся слова в массиве с предложениями в PHP - PullRequest
1 голос
/ 10 апреля 2019

У меня есть строковый массив со словами и предложениями.

Например:

array("dog","cat","the dog is running","some other text","some","text")

И я хочу удалить повторяющиеся слова, оставив в нем только уникальные слова.Я хочу удалить эти слова даже в предложениях.

Результат должен выглядеть следующим образом:

array("dog","cat","the is running","other","some","text")

Я пробовал функцию array_unique, но она не работала.

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Это решение не изящное, но оно должно быть выполнено и соответствовать некоторым крайним случаям под рукой.Я предполагаю, что не более одного пробела разделяет слова в строке предложения, и вы хотите сохранить исходное упорядочение.

Подход состоит в том, чтобы пройти массив дважды, один раз, чтобы отфильтровать дублирующиеся отдельные слова, затем один раз.снова отфильтровать повторяющиеся слова в предложениях.Это гарантирует приоритет для отдельных слов.Наконец, ksort массив (это уродливая часть с точки зрения сложности времени: все до 100 * * до сих пор).

$arr = ["dog","cat","the dog is running","some other text","some","text"];
$seen = [];
$result = [];

foreach ($arr as $i => $e) {
    if (preg_match("/^\w+$/", $e) && 
        !array_key_exists($e, $seen)) {
        $result[$i] = $e;
        $seen[$e] = 1;
    }
}

foreach ($arr as $i => $e) {
    $words = explode(" ", $e);

    if (count($words) > 1) {
        $filtered = [];

        foreach ($words as $word) {
            if (!array_key_exists($word, $seen)) {
                $seen[$word] = 0;
            }

            if (++$seen[$word] < 2) {
                $filtered[]= $word;
            }
        } 

        if ($filtered) {
            $result[$i] = implode($filtered, " ");
        }
    }
}

ksort($result);
$result = array_values($result);
print_r($result);

Вывод

Array
(
    [0] => dog
    [1] => cat
    [2] => the is running
    [3] => other
    [4] => some
    [5] => text
)
0 голосов
/ 10 апреля 2019

Вы можете использовать цикл array_unique after с разнесением и array_push:

$res = [];
foreach($arr as $e) {
    array_push($res, ...explode(" ", $e));
}
print_r(array_unique($res));

Ссылка: array_push , разнесение , массив-уникальный

Живой пример: 3v4l

Если вы хотите сохранить предложения, используйте:

$arr = array("dog","cat","the dog is running","some other text","some","text");

// sort first to get the shortest sentence first
usort($arr, function ($a, $b) {return count(explode(" ", $a)) - count(explode(" ", $b)); });

$words = [];
foreach($arr as &$e) {
    $res[] = trim(strtr($e, $words)); //get the word after swapping existing
    foreach(explode(" ", $e) as $w)
        $words[$w] =''; //add all new words to the swapping array with value of empty string
}
...