Forum Webscript.Ru
Программирование => PHP => Тема начата: Serge2k от 02 Января 2003, 18:45:03
-
Здравствуйте! С Новым годом!
Есть такая ситуация: скрипт берет текст (переданный переменной $text) и выбирает из него отдельные слова, выводя их построчно на экран:
preg_match_all(\'/([a-zA-Zа-яА-Я]+)/\',$text,$ok);
for ($i=0; $i {
echo $ok[1][$i]."
";
}
Нужно убрать совпадающие слова, чтобы на экран одно и то же слово выводилось только один раз.
Судя по тому, что написано в официальном мануале, одинаковые элементы из массива убирает функция array_unique (http://www.php.net/manual/en/function.array-unique.php)
Но скрипт с использованием этой функции не работает:
preg_match_all(\'/([a-zA-Zа-яА-Я]+)/\',$text,$ok);
$ok = array_unique ($ok);
for ($i=0; $i {
echo $ok[1][$i]."
";
}
Здесь я явно в чем-то ошибаюсь. Что я делаю неправильно?
-
а массив $ok тебе передаёт ожидаемые параматры??
-
Да уж, бывает... Не поставил единичку. Теперь функция работает:
preg_match_all(\'/([a-zA-Zа-яА-Я]+)/\',$text,$ok);
$ok = array_unique ($ok[1]);
for ($i=0; $i{
echo $ok[$i]."
";
}
Вот только получается не совсем то, чего мне хотелось бы. Функция, как выяснилось, совпадающие элементы заменяет пустыми, то есть по всей видимости массив
$a[0] = 13;
$a[1] = 12;
$a[2] = 13;
$a[3] = 15;
меняется на
$a[0] = 13;
$a[1] = 12;
$a[2] = ;
$a[3] = 15;
Во всяком случае, значение 15 остается по прежнему за третьим элементом. А нужно, чтобы он становился таким:
$a[0] = 13;
$a[1] = 12;
$a[2] = 15;
То есть, чтобы одинаковые элементы не только становились пустыми, но и исчезали как таковые, а на их место становились другие.
Можно ли это сделать в рамках array_unique (http://www.php.net/manual/en/function.array-unique.php), или для удаления пустых элементов служит какая-то другая функция?
-
Немного перепишем
$words = explode(" ", $text);
$words = array_values(array_unique($words));
for ($i = 0; $i < sizeof($words); $i++) {
if (trim($words[$i])) echo $words[$i]."
";
}
-
Ну что ж, похоже, тему можно закрывать - если кто-нибудь из модераторов сочтет нужным, может смело сделать это. Спасибо за размышления над вопросом.
Здесь действительно в тему используется array_values в паре с array_unique . Я этого не знал. Еще раз спасибо и всех с Новым годом!
-
GotZfild, ты, конечно, хорошее дело сделал, дал рабочий код.
А как быть с дремучими заблуждениями г-на Serge2k по поводу работы функции array_unique и того, что в массивах в РНР бывает первый, третий, или десятый элемент, а не элемент с индексом \'1\', \'3\', \'10\'?
Видишь - товарищ даже тему попросил закрыть, уверенный в том, что все понял.
-
В общем-то, хотелось бы кое-что уточнить. Никакой уверенности в том, что я все понял, я не изъявлял. GotZfild продемонстрировал конкретное решение проблемы, я с этим решением согласился и поблагодарил (я ведь не написал "спасибо, я все понял"). У меня сейчас жуткая сессия (через 7 часов экзамен), и нету времени читать в мануале на php.net описание функций для работы с массивами. Когда время будет, обязательно почитаю. Я сейчас пишу некоторые скрипты, поскольку это меня расслабляет, освобождает мозг от учебы. Это своеобразный отдых. Столкнулся с проблемой, глянул в мануал. Увидел там array_unique. Использовал. Не получилось. Спросил. Об array_values не знал.
Использование слова "индекс" в терминологии массивов многократно встречал. Но намного проще писать "первый элемент", чем "элемент с индексом \'1\'". Буду переучиваться.
Спасибо за конструктивную критику.
-
А ты безнадежен.
Вместо вопросов - какие-то никому не нужные оправдания.
"Спасибо за конструктивную критику" - и тут же демонстрация полного недохождения этой самой критики до расслабленного мозга.
Словоблуд.