Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Вопрос о функции array_unique()
Форумы портала PHP.SU » » Хранение данных, их вывод и обработка » Вопрос о функции array_unique()

Страниц (2): [1] 2 »
 

1. Костэн - 13 Июля, 2011 - 15:04:37 - перейти к сообщению
Доброго времени суток. У меня возникла ситуация, с которой не получается разобраться самостоятельно.

PHP:
скопировать код в буфер обмена
  1. for ($i = 0; $i < count($arr); $i++){
  2.  
  3.    $arraystring .= $arr[$i]["fulllit"];
  4. }
  5. $arraystringMassive = explode(";", $arraystring);
  6.                                                
  7. print_r(array_unique($arraystringMassive));


Как видно из кода - в цикле for я добавляю значения многомерного массива к существующим значениям строковой переменной. В ней в качестве разделителя выступает символ ";". Далее я сохраняю в массив $arraystringMassive список разделённых значений. После этого вывожу его структуру с целью удаления дубликатов, но почему то никакого эффекта не происходит. Подскажите, что я не так делаю ?
2. OrmaJever - 13 Июля, 2011 - 15:15:37 - перейти к сообщению
Костэн пишет:
В ней в качестве разделителя выступает символ ";"

это где в коде написано?
3. Костэн - 13 Июля, 2011 - 15:21:32 - перейти к сообщению
OrmaJever пишет:
это где в коде написано?


Переменная $arraystring хранит значения $arr[$i]["fulllit"] в которых присутствуют фразы, разделённые символом ";".
4. Мелкий - 13 Июля, 2011 - 15:26:46 - перейти к сообщению
Ну что тут можно сказать? phpfaq.ru/debug
5. OrmaJever - 13 Июля, 2011 - 15:27:32 - перейти к сообщению
Ну тогда сразу вопрос
масив $arraystringMassive проверяли? существует?
6. Костэн - 13 Июля, 2011 - 15:35:55 - перейти к сообщению
OrmaJever пишет:
масив $arraystringMassive проверяли? существует?


Объявляю его и $arraystring перед циклом for :

PHP:
скопировать код в буфер обмена
  1. $arraystringMassive = array();
  2. $arraystring = "";
7. OrmaJever - 13 Июля, 2011 - 15:37:27 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. не не после цыкла
  2. for ($i = 0; $i < count($arr); $i++){
  3.  
  4.    $arraystring .= $arr[$i]["fulllit"];
  5. }
  6. var_dump($arraystring);
  7. $arraystringMassive = explode(";", $arraystring);
  8. var_dump($arraystringMassive);                                                
  9. var_dump(array_unique($arraystringMassive));
8. Костэн - 13 Июля, 2011 - 15:49:59 - перейти к сообщению
OrmaJever пишет:
PHP:
скопировать код в буфер обмена
  1.  
  2. var_dump($arraystring) - string(1246) "...текст...";
  3. $arraystringMassive = explode(";", $arraystring);
  4. var_dump($arraystringMassive) - array(1) { [0]=> string(1246) "...текст... " };                                                
  5. var_dump(array_unique($arraystringMassive)) - тоже самое, что и без метода array_unque();
9. OrmaJever - 13 Июля, 2011 - 15:56:42 - перейти к сообщению
Костэн пишет:
var_dump($arraystringMassive) - array(1) { [0]=> string(1246) "...текст... " };

Вот здесь надо внимательно сравнить значения и количество символов. Если после array_unique масив не изменился значит там нету повторяющихся елементов, там могуб быть пробелы или \n например
10. Мелкий - 13 Июля, 2011 - 15:58:36 - перейти к сообщению
Костэн пишет:
$arraystringMassive = explode(";", $arraystring);
var_dump($arraystringMassive) - array(1) {

Цитата:
Если separator не содержится в string, то explode() возвращает массив, содержащий один элемент string.

Намёк ясен?
11. Костэн - 14 Июля, 2011 - 09:19:20 - перейти к сообщению
OrmaJever пишет:
Вот здесь надо внимательно сравнить значения и количество символов. Если после array_unique масив не изменился значит там нету повторяющихся елементов, там могуб быть пробелы или \n например


Извиняюсь, что ввёл Вас в заблуждение. Когда перебирал возможные варианты решения проблемы - удалил из результата запроса к базе данных символ ";" и забыл за это. После исправления, функция
показала, что в некоторых, на первый взгляд одинаковых строках присутствует разница в один символ. Также она показала и одинаковое количество символов в идентичных по содержанию строках, которые остались нетронутыми после применения функции
PHP:
скопировать код в буфер обмена
. Пытался удалить лишние символы функцией
PHP:
скопировать код в буфер обмена
  1.  trim()
, но никаких изменений не произошло.

Мелкий пишет:
Намёк ясен?

Ясен, только толка от этого никакого.



Пытался выразить благодарность за помощь в решении проблемы, но не получилось, так как у меня ещё мало сообщений. С этим всё понятно, только вот ответ с сервера пришёл неполноценный, если исходить из выведенного firebug'om JSON - сообщения - ", количество сообщений оставленных Вами на форуме, недостаточно для данной операции.". Учитывая, что в начале предложения стоит запятая, то нетрудно догадаться, что перед ней должен быть мой ник-name Улыбка
12. OrmaJever - 14 Июля, 2011 - 11:12:43 - перейти к сообщению
Костэн пишет:
Извиняюсь, что ввёл Вас в заблуждение. Когда перебирал возможные варианты решения проблемы - удалил из результата запроса к базе данных символ ";" и забыл за это

Ну вот видите проблема началась из самого начала
OrmaJever пишет:
В ней в качестве разделителя выступает символ ";"

это где в коде написано?

если explode поделил строку на масив то пол проблемы решено.
Костэн пишет:
показала, что в некоторых, на первый взгляд одинаковых строках присутствует разница в один символ.

Возможно это и есть \n или \r или табуляция их должна удалить trim()
Костэн пишет:
Также она показала и одинаковое количество символов в идентичных по содержанию строках, которые остались нетронутыми после применения функции

идентичный на взгляд не значит идентичных. Например "С" и "C" на вид одинаковые? Только одна руская а вторая англиская, для человека безразницы а для програмы абсолютно другой символ. Ну и кодировка тоже может внести свой вклад Подмигивание
13. Костэн - 14 Июля, 2011 - 11:34:00 - перейти к сообщению
OrmaJever пишет:
Возможно это и есть \n или \r или табуляция их должна удалить trim()

Должна, но почему то не удалила, так как после её применения длинна строк не изменилась.
OrmaJever пишет:
идентичный на взгляд не значит идентичных. Например "С" и "C" на вид одинаковые? Только одна руская а вторая англиская, для человека безразницы а для програмы абсолютно другой символ. Ну и кодировка тоже может внести свой вклад

Это я понимаю Улыбка Просто все повторяющиеся значения берутся из одной и той же строки таблицы базы данных. Поэтому вариант с одинаковым "внешним видом" символов отпадает. Кодировка базы данных - UTF8, также как и страница, на которую выводится информация. Меня больше беспокоит - по какой причине функция array_unque() не удаляет повторные значения в массиве, когда они полностью идентичны ? Если честно - не думал, что с такой функцией могут возникнуть такие трудности.
14. Костэн - 14 Июля, 2011 - 16:17:36 - перейти к сообщению
Для примера сделал тестовую строку:
PHP:
скопировать код в буфер обмена
  1. $testString =trim("<li>Тестовое значение \n1</li>;<li>Тестовое значение 2</li>;<li>Тестовое значение 1</li>;");
  2. $arraystringMassive = explode(";", $testarraystring);
  3. var_dump(array_unique($arraystringMassive));


Когда удаляю "\n" - функция array_unique() отрабатывает нормально. Что то функция trim() не хочет работать.
15. Мелкий - 14 Июля, 2011 - 16:27:53 - перейти к сообщению
Костэн пишет:
Что то функция trim() не хочет работать.

А читать описание trim не пробовали? Она делает именно то, что должна, а не то, что вы думаете.

Костэн пишет:
Ясен, только толка от этого никакого.

А по мне - так более чем много толку. В частности - выяснилось, что у вас некорректны входные данные, а сам представленный фрагмент кода - работает.

 

Powered by ExBB FM 1.0 RC1