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 :: Почему пустые значения в массиве распознаются как не пустые?

 PHP.SU

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


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

> Без описания
Rooner
Отправлено: 11 Октября, 2012 - 15:12:49
Post Id


Посетитель


Покинул форум
Сообщений всего: 291
Дата рег-ции: Авг. 2010  


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




Есть список в кривом виде, с пустыми строками, нужно разбить его на подстроки и вывести все не пустые значения. Проблема в том что пустые значения скрипт видит как не пустые. Кодировка utf-8
PHP:
скопировать код в буфер обмена
  1. $str = '
  2. артикул:12345
  3.  
  4. цвет:желтый
  5. ';
  6.  
  7. $lines = explode("\n", trim($str));
  8. $lines = array_diff($lines, array('')); // не удаляет пустые значения
  9. foreach($lines as $i => $line) {
  10.   if (!empty($line)) echo $line."<br />"; // не видит пустые значения
  11. }

Выводит:
CODE (html):
скопировать код в буфер обмена
  1. артикул:12345
  2.  
  3. цвет:желтый


А должен выводить:
CODE (html):
скопировать код в буфер обмена
  1. артикул:12345
  2. цвет:желтый

(Отредактировано автором: 11 Октября, 2012 - 15:14:35)

 
 Top
EuGen Администратор
Отправлено: 11 Октября, 2012 - 15:17:32
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




var_dump($lines); сразу после его формирования много о чем расскажет.
И - разумнее здесь использовать array_map + trim


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Rooner
Отправлено: 11 Октября, 2012 - 15:21:02
Post Id


Посетитель


Покинул форум
Сообщений всего: 291
Дата рег-ции: Авг. 2010  


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




EuGen, разумеется я смотрю что внутри массива, а конкретнее в $lines[1] ничего нет, а еще конкретнее вот так echo 'd'.$lines[1].'d'; выводится пробел. Но если поставить условие if ($line != ' ') echo $line."<br />"; то оно не работает!

На счет array_map + trim сейчас почитаю...
(Добавление)
Ну array_map хорошее решение для такой простой задачи, только оно не решает мою проблему
 
 Top
EuGen Администратор
Отправлено: 11 Октября, 2012 - 15:29:30
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Вот что в нем находится:
CODE (htmlphp):
скопировать код в буфер обмена
  1. array(3) {
  2.   [0]=>
  3.   string(21) "артикул:12345
  4. "
  5.   [1]=>
  6.   string(1) "
  7. "
  8.   [2]=>
  9.   string(21) "цвет:желтый"
  10. }

- теперь, я думаю, понятно поведение функции array_diff (вспомните про \r и \n).

Да, кстати, не уточнил - если задача просто в том, чтобы разбить строку на массив с непустыми элементами (а не обрабатывать их как-либо, что можно сделать с помощью замыкания, как я предлагал выше), то решается все еще проще:
PHP:
скопировать код в буфер обмена
  1. $str = '
  2. артикул:12345
  3.  
  4. цвет:желтый
  5. ';
  6.      
  7. $rgResult=preg_split('/[\r\n]+/',$str, -1, PREG_SPLIT_NO_EMPTY);

Единственное - считать ли строки, целиком состоящие из пробелов - пустыми? Если да, то вариант выше нужно немного модифицировать (а именно - регулярное выражение в preg_split)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Rooner
Отправлено: 11 Октября, 2012 - 15:33:07
Post Id


Посетитель


Покинул форум
Сообщений всего: 291
Дата рег-ции: Авг. 2010  


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




EuGen, забыл про \r, вместо \n нужно было поставить \r\n, вобщем все стало понятно, спасибо.
 
 Top
armancho7777777 Супермодератор
Отправлено: 11 Октября, 2012 - 16:29:37
Post Id



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


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


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




Можно так ещё:
PHP:
скопировать код в буфер обмена
  1. $lines = file('my_file.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

Вы же данные из файла берёте ?

(Отредактировано автором: 11 Октября, 2012 - 16:33:54)

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


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB