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 :: Версия для печати :: Проблема с данными
Форумы портала PHP.SU » » Вопросы новичков » Проблема с данными

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

1. Estenny - 01 Ноября, 2011 - 16:36:26 - перейти к сообщению
У меня есть файл 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.
2. Stierus - 01 Ноября, 2011 - 16:38:14 - перейти к сообщению
это все динамическая типизация, детка Улыбка
(Добавление)
в мануале говорится, что возвращается не массив строк (string array), а array of file lines - это разные вещи. если хочешь строго заданный тип - можешь к нему привести (int) $users[0] или intval($users[0]) ... но динамическая типизация, будь она неладна, в любой момент тебе норовит приподнести новый сюрприз Улыбка
3. Estenny - 01 Ноября, 2011 - 16:52:39 - перейти к сообщению
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', я прав?
4. Мелкий - 01 Ноября, 2011 - 16:55:50 - перейти к сообщению
Есть вариант заменить file на

Возвращает array of strings, и по крайней мере, быстрее.
5. White - 01 Ноября, 2011 - 17:00:08 - перейти к сообщению
Stierus пишет:
динамическая типизация, будь она неладна
тоже ее не люблю но здесь все намного проще.
при считывании с помощью file() в строки часто лезут пробельные символы, поэтому:
PHP:
скопировать код в буфер обмена
  1. if (trim($users[0]) == '123') echo 'true'; else echo 'false';
6. Estenny - 01 Ноября, 2011 - 17:00:34 - перейти к сообщению
Мелкий, отлично, работает. Но у меня вопрос: что такое PHP_EOL? Я понимаю, что это шаблон разделения для метода, но не понимаю какой и как он работает!


White, во, вот это вообще идеально. У меня было предположение, что тут не все ладно с пробелами.
7. Мелкий - 01 Ноября, 2011 - 17:09:46 - перейти к сообщению
Estenny пишет:
что такое PHP_EOL?

Это константа PHP, конец строки для платформы, на которой исполняется скрипт.
\n для никсов, \r\n для виндов
8. Estenny - 01 Ноября, 2011 - 17:12:28 - перейти к сообщению
Спасибо всем! В карму поставить не могу, простите Улыбка .
(Добавление)
Упс, появился небольшой вопрос: когда я записываю данные в файл, мне надо сделать в нем перенос строки. Записываю с помощью fwrite(). \n не подходит.
9. White - 01 Ноября, 2011 - 17:49:57 - перейти к сообщению
Estenny в этом случае \n только в двойных кавычках
10. OrmaJever - 01 Ноября, 2011 - 17:50:02 - перейти к сообщению
Estenny пишет:
Упс, появился небольшой вопрос: когда я записываю данные в файл, мне надо сделать в нем перенос строки. Записываю с помощью fwrite(). \n не подходит.

PHP_EOL, переводится как PHP End of Line
11. Estenny - 01 Ноября, 2011 - 18:14:05 - перейти к сообщению
White, спасибо, совсем забыл про это.

 

Powered by ExBB FM 1.0 RC1