Удалить повторяющиеся данные из массива POST

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

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

Мой код прост:

if(!empty($_POST['keywords']))
{
    $posted = $_POST['keywords'];

    $posted = array_unique($posted);

    echo $posted;
}

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

Форма:

    <form action="<?php $_SERVER['PHP_SELF']; ?>" method="post">
    <p>
        <textarea name="keywords" rows="20" columns="120"></textarea>
    </p>

    <p>
        <input type="submit" name="submit" />
    </p>
</form>

person 714sooner    schedule 15.12.2011    source источник


Ответы (4)


Рассмотрим сначала разделение аргумента keywords пробелами, а затем поиск уникальных значений:

$posted = array_unique(explode(' ', str_replace("\n", ' ', $posted)));
person Nathan    schedule 15.12.2011
comment
... кроме того, при отображении результата переменная $posted представляет собой массив, поэтому для просмотра ее значения можно было бы выполнить «echo print_r($posted, true)» (или, возможно, просто «print_r($posted)» - person Nathan; 15.12.2011
comment
Эй, Натан, я попробовал это и получил следующее: Массив ( [0] => test test ) ... как будто он все еще вызывает его как строку. - person 714sooner; 15.12.2011
comment
я предполагаю, что значение textarea содержит новую строку - попробуйте эту версию, которая сначала преобразует новую строку в пробел. - person Nathan; 15.12.2011
comment
Хорошо, спасибо! Я тоже добавил в ответ. Новая строка определенно внесла изменения, но она все еще не удаляла дубликат. Теперь это работает так: code $posted = array_unique(explode(' ', str_replace(\r\n, ' ', $posted))); - person 714sooner; 15.12.2011

Возможно, вам следует изучить использование array_filter

Таким образом, вы можете определить свою собственную функцию обратного вызова для максимальной строгости при удалении...

http://php.net/manual/en/function.array-filter.php

Также: вы пробовали возиться с флагами array_unique?

http://php.net/manual/en/function.array-unique.php

person Zigu    schedule 15.12.2011
comment
Я не пробовал никаких флагов, так как я просто медленно наращивал их. На данный момент я просто не могу удалить дубликаты. Я посмотрю на флаги. Спасибо! - person 714sooner; 15.12.2011

Ваше поле формы ключевых слов настроено как текстовое поле, поэтому, когда вы публикуете, вы публикуете строку. Попробуй это:

$posted = $_POST['keywords'];

$postedKeywords = explode(' ', $posted);

$posted = array_unique($postedKeywords);
person Mike Purcell    schedule 15.12.2011
comment
Итак, я попробовал это и использовал print_r. Я попробовал test 2x и получил следующее: Array ( [0] => test test ) - person 714sooner; 15.12.2011
comment
@ 714sooner: Вероятно, некоторые символы, не являющиеся пробелами, изобилуют. Попробуйте решение Аймана, так как регулярное выражение будет более надежным. - person Mike Purcell; 15.12.2011
comment
Спасибо, похоже, это были символы без пробелов. Я ценю его! :) - person 714sooner; 15.12.2011

Предыдущие ответы великолепны, но поскольку слова вводятся в текстовое поле, разделитель будет непредсказуемым. Вместо этого рассмотрите возможность использования регулярного выражения:

preg_match_all('/([^\s]+)/', $_POST['keywords'], $matches);
$unique_words = array_unique($matches[0]);
person Ayman Safadi    schedule 15.12.2011
comment
Айман, я только что попробовал это, и это тоже работает. Спасибо за идею! - person 714sooner; 15.12.2011
comment
Я только что понял, что есть проблема с этим. Поскольку он удаляет пробелы, он также превращает любые слова с пробелами (например, айман сафади) в несколько слов. - person 714sooner; 15.12.2011
comment
То же самое произошло бы с:explore(' ', $_POST['keywords']) Вы можете указать пользователю использовать либо запятые, либо разрывы строк. Или придумайте какое-нибудь причудливое внешнее решение, чтобы убедиться, что пользователь правильно вводит слова. - person Ayman Safadi; 15.12.2011
comment
Да, теперь я это вижу. Оба отлично работают для отдельных слов без пробелов, но превращают слова с пробелами в отдельные слова. - person 714sooner; 15.12.2011
comment
@ 714sooner - Просто хотел убедиться, что вы прочитали мой отредактированный комментарий. - person Ayman Safadi; 15.12.2011
comment
Спасибо за это. Я посмотрю, есть ли способ автоматически добавлять запятые в конец каждого слова. Не уверен, почему это тоже становится болью, но все же пытаюсь! га - person 714sooner; 15.12.2011