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\'". Буду переучиваться.
 Спасибо за конструктивную критику.
- 
				А ты безнадежен.
 Вместо вопросов - какие-то никому не нужные оправдания.
 "Спасибо за конструктивную критику" - и тут же демонстрация полного недохождения этой самой критики до расслабленного мозга.
 
 Словоблуд.