Это решение не изящное, но оно должно быть выполнено и соответствовать некоторым крайним случаям под рукой.Я предполагаю, что не более одного пробела разделяет слова в строке предложения, и вы хотите сохранить исходное упорядочение.
Подход состоит в том, чтобы пройти массив дважды, один раз, чтобы отфильтровать дублирующиеся отдельные слова, затем один раз.снова отфильтровать повторяющиеся слова в предложениях.Это гарантирует приоритет для отдельных слов.Наконец, 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
)