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]   

> Без описания
Estenny
Отправлено: 01 Ноября, 2011 - 16:36:26
Post Id



Гость


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


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




У меня есть файл users.txt, который содержит в себе 2 строки:
Цитата:
123
abc

В моем скрипте я открываю этот файл с помощью file() и, как написано в мануалах этого сайта, мне должен вернутся массив. Как я понимаю, каждый эл-нт массива имеет тип string. Дальше я сравниваю 1 эл-мент из массива с строкой '123'. Выводит false. Если я попытаюсь сравнить не со строкой, а с чистом 123, то выводит true, но если я буду сравнивать по типу элемент и число, то выведет false. А теперь самое интересно: если получить тип элемента массива (gettype), то мне выдаст string! В чем проблема? Объясните, пожалуйста.

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.         $users = file('users.txt');
  3.        
  4.         if ($users[0] == '123') echo 'true'; else echo 'false'; // => false
  5.         echo '<br>';
  6.         if ($users[0] == 123) echo 'true'; else echo 'false'; // => true
  7.         echo '<br>';
  8.         if ($users[0] === 123) echo 'true'; else echo 'false'; // => false
  9.         echo '<br>';
  10.         echo gettype($users[0]); // => string
  11. ?>


Работаю на Ubuntu. К теме прикреплю файл users.txt.

(Отредактировано автором: 01 Ноября, 2011 - 16:37:15)

 
 Top
Stierus Супермодератор
Отправлено: 01 Ноября, 2011 - 16:38:14
Post Id



Рекордсмен по количеству сообщений за 7 дней


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


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




это все динамическая типизация, детка Улыбка
(Добавление)
в мануале говорится, что возвращается не массив строк (string array), а array of file lines - это разные вещи. если хочешь строго заданный тип - можешь к нему привести (int) $users[0] или intval($users[0]) ... но динамическая типизация, будь она неладна, в любой момент тебе норовит приподнести новый сюрприз Улыбка
 
My status
 Top
Estenny
Отправлено: 01 Ноября, 2011 - 16:52:39
Post Id



Гость


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


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




Stierus, ну с переводом в число я понял, а вот как сравнить с переводом в строку?

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.         $users = file('users.txt');
  3.        
  4.         $users[0] = strval($users[0]);
  5.         if ($users[0] == '123') echo 'true'; else echo 'false'; // => false
  6.         echo '<br>';
  7.         if ($users[0] === '123') echo 'true'; else echo 'false'; // => false
  8.         echo '<br>';
  9.         echo gettype($users[0]); // => string
  10. ?>


Получается, что какой бы ни был тип у $users[0], я сделал так, чтобы $users[0] был равен '123', я прав?

(Отредактировано автором: 01 Ноября, 2011 - 16:54:28)

 
 Top
Мелкий Супермодератор
Отправлено: 01 Ноября, 2011 - 16:55:50
Post Id



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


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


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




Есть вариант заменить file на

Возвращает array of strings, и по крайней мере, быстрее.


-----
PostgreSQL DBA
 
 Top
White
Отправлено: 01 Ноября, 2011 - 17:00:08
Post Id



Частый посетитель


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


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




Stierus пишет:
динамическая типизация, будь она неладна
тоже ее не люблю но здесь все намного проще.
при считывании с помощью file() в строки часто лезут пробельные символы, поэтому:
PHP:
скопировать код в буфер обмена
  1. if (trim($users[0]) == '123') echo 'true'; else echo 'false';


-----
if(time()>1356048000) die();
 
 Top
Estenny
Отправлено: 01 Ноября, 2011 - 17:00:34
Post Id



Гость


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


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




Мелкий, отлично, работает. Но у меня вопрос: что такое PHP_EOL? Я понимаю, что это шаблон разделения для метода, но не понимаю какой и как он работает!


White, во, вот это вообще идеально. У меня было предположение, что тут не все ладно с пробелами.

(Отредактировано автором: 01 Ноября, 2011 - 17:03:42)

 
 Top
Мелкий Супермодератор
Отправлено: 01 Ноября, 2011 - 17:09:46
Post Id



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


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


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




Estenny пишет:
что такое PHP_EOL?

Это константа PHP, конец строки для платформы, на которой исполняется скрипт.
\n для никсов, \r\n для виндов


-----
PostgreSQL DBA
 
 Top
Estenny
Отправлено: 01 Ноября, 2011 - 17:12:28
Post Id



Гость


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


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




Спасибо всем! В карму поставить не могу, простите Улыбка .
(Добавление)
Упс, появился небольшой вопрос: когда я записываю данные в файл, мне надо сделать в нем перенос строки. Записываю с помощью fwrite(). \n не подходит.
 
 Top
White
Отправлено: 01 Ноября, 2011 - 17:49:57
Post Id



Частый посетитель


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


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




Estenny в этом случае \n только в двойных кавычках


-----
if(time()>1356048000) die();
 
 Top
OrmaJever Модератор
Отправлено: 01 Ноября, 2011 - 17:50:02
Post Id



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


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


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




Estenny пишет:
Упс, появился небольшой вопрос: когда я записываю данные в файл, мне надо сделать в нем перенос строки. Записываю с помощью fwrite(). \n не подходит.

PHP_EOL, переводится как PHP End of Line


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Estenny
Отправлено: 01 Ноября, 2011 - 18:14:05
Post Id



Гость


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


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




White, спасибо, совсем забыл про это.
 
 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