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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Вопрос о функции array_unique()

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Костэн
Отправлено: 13 Июля, 2011 - 15:04:37
Post Id


Новичок


Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2007  
Откуда: Россия, Ставрополь


Помог: 0 раз(а)




Доброго времени суток. У меня возникла ситуация, с которой не получается разобраться самостоятельно.

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

(Отредактировано автором: 13 Июля, 2011 - 15:04:53)

 
 Top
OrmaJever Модератор
Отправлено: 13 Июля, 2011 - 15:15:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Костэн пишет:
В ней в качестве разделителя выступает символ ";"

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


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Костэн
Отправлено: 13 Июля, 2011 - 15:21:32
Post Id


Новичок


Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2007  
Откуда: Россия, Ставрополь


Помог: 0 раз(а)




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


Переменная $arraystring хранит значения $arr[$i]["fulllit"] в которых присутствуют фразы, разделённые символом ";".
 
 Top
Мелкий Супермодератор
Отправлено: 13 Июля, 2011 - 15:26:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Ну что тут можно сказать? phpfaq.ru/debug


-----
PostgreSQL DBA
 
 Top
OrmaJever Модератор
Отправлено: 13 Июля, 2011 - 15:27:32
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Ну тогда сразу вопрос
масив $arraystringMassive проверяли? существует?


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Костэн
Отправлено: 13 Июля, 2011 - 15:35:55
Post Id


Новичок


Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2007  
Откуда: Россия, Ставрополь


Помог: 0 раз(а)




OrmaJever пишет:
масив $arraystringMassive проверяли? существует?


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

PHP:
скопировать код в буфер обмена
  1. $arraystringMassive = array();
  2. $arraystring = "";

(Отредактировано автором: 13 Июля, 2011 - 15:36:11)

 
 Top
OrmaJever Модератор
Отправлено: 13 Июля, 2011 - 15:37:27
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




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));


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Костэн
Отправлено: 13 Июля, 2011 - 15:49:59
Post Id


Новичок


Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2007  
Откуда: Россия, Ставрополь


Помог: 0 раз(а)




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();
 
 Top
OrmaJever Модератор
Отправлено: 13 Июля, 2011 - 15:56:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Костэн пишет:
var_dump($arraystringMassive) - array(1) { [0]=> string(1246) "...текст... " };

Вот здесь надо внимательно сравнить значения и количество символов. Если после array_unique масив не изменился значит там нету повторяющихся елементов, там могуб быть пробелы или \n например


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Мелкий Супермодератор
Отправлено: 13 Июля, 2011 - 15:58:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Костэн пишет:
$arraystringMassive = explode(";", $arraystring);
var_dump($arraystringMassive) - array(1) {

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

Намёк ясен?


-----
PostgreSQL DBA
 
 Top
Костэн
Отправлено: 14 Июля, 2011 - 09:19:20
Post Id


Новичок


Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2007  
Откуда: Россия, Ставрополь


Помог: 0 раз(а)




OrmaJever пишет:
Вот здесь надо внимательно сравнить значения и количество символов. Если после array_unique масив не изменился значит там нету повторяющихся елементов, там могуб быть пробелы или \n например


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

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

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



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

(Отредактировано автором: 14 Июля, 2011 - 09:28:52)

 
 Top
OrmaJever Модератор
Отправлено: 14 Июля, 2011 - 11:12:43
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Костэн пишет:
Извиняюсь, что ввёл Вас в заблуждение. Когда перебирал возможные варианты решения проблемы - удалил из результата запроса к базе данных символ ";" и забыл за это

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

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

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

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

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


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Костэн
Отправлено: 14 Июля, 2011 - 11:34:00
Post Id


Новичок


Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2007  
Откуда: Россия, Ставрополь


Помог: 0 раз(а)




OrmaJever пишет:
Возможно это и есть \n или \r или табуляция их должна удалить trim()

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

Это я понимаю Улыбка Просто все повторяющиеся значения берутся из одной и той же строки таблицы базы данных. Поэтому вариант с одинаковым "внешним видом" символов отпадает. Кодировка базы данных - UTF8, также как и страница, на которую выводится информация. Меня больше беспокоит - по какой причине функция array_unque() не удаляет повторные значения в массиве, когда они полностью идентичны ? Если честно - не думал, что с такой функцией могут возникнуть такие трудности.

(Отредактировано автором: 14 Июля, 2011 - 11:34:34)

 
 Top
Костэн
Отправлено: 14 Июля, 2011 - 16:17:36
Post Id


Новичок


Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2007  
Откуда: Россия, Ставрополь


Помог: 0 раз(а)




Для примера сделал тестовую строку:
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() не хочет работать.
 
 Top
Мелкий Супермодератор
Отправлено: 14 Июля, 2011 - 16:27:53
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Костэн пишет:
Что то функция trim() не хочет работать.

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

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

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


-----
PostgreSQL DBA
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Хранение данных, их вывод и обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB