Удалить повторяющиеся слова в массиве с предложениями в PHP

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

Например:

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

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

Результат должен выглядеть так:

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

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

Добро пожаловать в СО! Каковы ваши требования, для которых дубликаты должны быть удалены? Похоже, вы предпочитаете использовать отдельные слова, а не слова в предложениях, но пояснение было бы полезно.

ggorlen 10.04.2019 21:46

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

Nico Haase 10.04.2019 21:48

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

forprogramming777 10.04.2019 21:48

Еще одно дополнение: " " ваш единственный разделитель слов? Весь контент либо в алфавитном порядке, либо через один пробел?

ggorlen 10.04.2019 21:52

в моем массиве есть только " ", если есть предложения

forprogramming777 10.04.2019 21:58

@ forprogramming777 - помог ли вам мой пост? это решило вашу проблему?

dWinder 11.04.2019 21:36

@dWinder, спасибо, приятель!! именно то, что я искал

forprogramming777 11.04.2019 21:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
7
358
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

Ссылка: array_push, взорваться, уникальный массив

Живой пример: 3х4л

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

$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
}

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

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

$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
)

Другие вопросы по теме