Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как июнь превращается в сентябрь?
 
 автор: Владимир55   (10.06.2008 в 10:03)   письмо автору
 
 

Есть код

         $mes = date("m");
    if ($mes == 01) $mes = "января";
    echo "<br> 01 $mes";
    if ($mes == 02) $mes = "февраля";
    echo "<br> 02 $mes";
    if ($mes == 03) $mes = "марта";
    echo "<br> 03 $mes";
    if ($mes == 04) $mes = "апреля";
    echo "<br> 04 $mes";
    if ($mes == 05) $mes = "мая";
    echo "<br> 05 $mes";
    if ($mes == 06) $mes = "июня";
    echo "<br> 06 $mes";
    if ($mes == 07) $mes = "июля";
    echo "<br> 07 $mes";
    if ($mes == 08) $mes = "августа";
    echo "<br> 08 $mes";
    if ($mes == 09) $mes = "сентября";
    echo "<br> 09 $mes";
    if ($mes == 10) $mes = "октября";
    echo "<br> 10 $mes";
    if ($mes == 11) $mes = "ноября";
    echo "<br> 11 $mes";
    if ($mes == 12) $mes = "декабря";
    echo "<br> 12 $mes";

    $tmp = " Сегодня " . date("d") . " " . $mes . " " . date("Y") . " " . date("H") . ":" . date("i") . ":" . date("s"); 
    echo "<br> $tmp";
При его работе получаем:
01 06
02 06
03 06
04 06
05 06
06 июня
07 июня
08 июня
09 сентября
10 сентября
11 сентября
12 сентября
Сегодня 10 сентября 2008 09:55:07

Исправить ситуацию несложно - надо либо сделать замену переменных типа

if ($mes == 01) $mes1 = "января"; 
либо числа заключть в кавычки, что гораздо правильнее

if ($mes == "01") $mes1 = "января"; 


Но хочется выяснить, почему этот некорректный код работает так странно: первые 8 строк обрабатывает правильно, на девятой строке сбивается, а десятую-двенадцатую обрабатывает верно?

   
 
 автор: mihdan   (10.06.2008 в 10:29)   письмо автору
 
   для: Владимир55   (10.06.2008 в 10:03)
 

<?
$mes 
date("n");
    if (
$mes == 1$rmes "января";
    echo 
"<br> 1 $rmes";
    if (
$mes == 2$rmes "февраля";
    echo 
"<br> 2 $rmes";
    if (
$mes == 3$rmes "марта";
    echo 
"<br> 3 $rmes";
    if (
$mes == 4$rmes "апреля";
    echo 
"<br> 4 $rmes";
    if (
$mes == 5$rmes "мая";
    echo 
"<br> 5 $rmes";
    if (
$mes == 6$rmes "июня";
    echo 
"<br> 6 $rmes";
    if (
$mes == 7$rmes "июля";
    echo 
"<br> 7 $rmes";
    if (
$mes == 8$rmes "августа";
    echo 
"<br> 8 $rmes";
    if (
$mes == 9$rmes "сентября";
    echo 
"<br> 9 $rmes";
    if (
$mes == 10$rmes "октября";
    echo 
"<br> 10 $rmes";
    if (
$mes == 11$rmes "ноября";
    echo 
"<br> 11 $rmes";
    if (
$mes == 12$rmes "декабря";
    echo 
"<br> 12 $rmes";

    
$tmp " Сегодня " date("d") . " " $mes " " date("Y") . " " date("H") . ":" date("i") . ":" date("s"); 
    echo 
"<br> $tmp"
?>


Но я бы сделал так:

<?
$months 
= array ('января''февраля''марта''апреля''мая''июня''июля''августа''сентября''октября''ноября''декабря');
$curr_month date('n');

echo 
'Сегодня: '.date('d').' '.$months[$curr_month-1].' '.date('Y').' года';
?>

   
 
 автор: Владимир55   (10.06.2008 в 12:13)   письмо автору
 
   для: mihdan   (10.06.2008 в 10:29)
 

Рецепт Ваш хорош! Но всё же, почему так себя ведут операторы IF в моем коде?

Хочется понять на будущее.

   
 
 автор: elenaki   (10.06.2008 в 12:26)   письмо автору
 
   для: Владимир55   (10.06.2008 в 12:13)
 

if ($mes == 06) $mes = "june";
==========================

условие верно, значение переменной $mes поменялось, оно уже не 06. с чем сравниваете дальше?

   
 
 автор: Владимир55   (10.06.2008 в 13:04)   письмо автору
 
   для: elenaki   (10.06.2008 в 12:26)
 

Вот и я тоже так рассуждал!

Вроде бы, при дальнейших сравнениях совпадений быть не млжет, а потому должен остаться "июнь".

Но на практике - посмотрите приведённый вывод - опратор IF приравнивает "июнь" к 09! Если сомневаетесь, запуститете этот скриптик...

Я не знаю, почему так происходит. Может, глюк рнр вылез.

   
 
 автор: elenaki   (10.06.2008 в 13:11)   письмо автору
 
   для: Владимир55   (10.06.2008 в 13:04)
 

поставьте все 01,02 и тд в кавычках и будет только июнь. а без кавычек не имеет смысла.
числа в виде 01 не существует, а строка 01 должна быть в кавычках. надо рыть в сторону
преобразования типов в PHP.

http://www2.stack.ru/~julia/PHP4/language.types.type-juggling.html

   
 
 автор: Владимир55   (10.06.2008 в 13:53)   письмо автору
 
   для: elenaki   (10.06.2008 в 13:11)
 

Это понятно, про кавычки я уже писал.

   
 
 автор: BinLaden   (10.06.2008 в 14:16)   письмо автору
 
   для: Владимир55   (10.06.2008 в 13:53)
 

В PHP числа, начинающиеся на "0" интерпретируются как восьмиричные.

   
 
 автор: Trianon   (10.06.2008 в 20:43)   письмо автору
 
   для: Владимир55   (10.06.2008 в 13:53)
 

Вы неверно процитировали вывод скрипта.
08 там соответствует августу.
И такой вариант уже вполне объясним.

Записи 08, 09 равны нулю по причине, указанной BinLaden'ом.
Любое из слов месяца после приведения к целому тоже равно нулю.
Поэтому август и сентябрь и были присвоены.

   
 
 автор: TXC   (10.06.2008 в 22:52)   письмо автору
 
   для: Trianon   (10.06.2008 в 20:43)
 

+1 надо было сравнивать со строкой, а не числом.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования