У меня есть массив строк со словами и предложениями.
Например:
array("dog","cat","the dog is running","some other text","some","text")
И я хочу удалить повторяющиеся слова, оставив в нем только уникальные слова. Я хочу убрать эти слова даже из предложений.
Результат должен выглядеть так:
array("dog","cat","the is running","other","some","text")
Я попробовал функцию array_unique
, но она не сработала.
Как бы выглядел результат, если бы первый и третий элементы входного массива поменялись местами?
да, я хотел бы сохранить отдельные слова в массиве, которые уникальны.
Еще одно дополнение: " "
ваш единственный разделитель слов? Весь контент либо в алфавитном порядке, либо через один пробел?
в моем массиве есть только " ", если есть предложения
@ forprogramming777 - помог ли вам мой пост? это решило вашу проблему?
@dWinder, спасибо, приятель!! именно то, что я искал
Вы можете использовать цикл 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
)
Добро пожаловать в СО! Каковы ваши требования, для которых дубликаты должны быть удалены? Похоже, вы предпочитаете использовать отдельные слова, а не слова в предложениях, но пояснение было бы полезно.