1. PHP / Говнокод #2275

    +167.8

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    function returnDate($stamp){
    global $settings;
    $day = strftime("%d",$stamp+($settings['timeoffset']*3600));
    $month = strftime("%m",$stamp+($settings['timeoffset']*3600));
    $year = strftime("%Y",$stamp+($settings['timeoffset']*3600));
    switch ($month){
    case 01 : $month = "01"; break;
    case 02 : $month = "02"; break;
    case 03 : $month = "03"; break;
    case 04 : $month = "04"; break;
    case 05 : $month = "05"; break;
    case 06 : $month = "06"; break;
    case 07 : $month = "07"; break;
    case 08 : $month = "08"; break;
    case 09 : $month = "09"; break;
    case 10 : $month = "10"; break;
    case 11 : $month = "11"; break;
    case 12 : $month = "12"; break;
    }
    return "$day.$month.$year";
    }

    Взято из чешского шаблона под одну цмску. Автору, наверно, платят как Маяковскому - за каждую строчку :-)

    Запостил: |)3F, 13 Декабря 2009

    Комментарии (27) RSS

    • case 09

      09 != 9
      Ответить
      • даладно
        Ответить
      • 08 тоже.
        Ответить
      • ты хотел сказать 09 != "09"?
        Ответить
        • Нет, именно сравнение чисел

          09 - это в восмеричной системе счисления. А так как это не правильная запись, то 09 в PHP преобразуется в число 0
          Ответить
          • Ты сам сейчас понял что сказал? откуда в восьмеричной системе цифра 9? :D
            Ответить
            • 01-07 - это да, восьмеричная система, но эти числа совпадают с 1-7 в десятичной системе, так что в этом плане тут "полу-говнокод"
              Ответить
            • Сорри, туплю! ты прав конечно же. невнимательно прочитал твой комент
              Ответить
            • Прочитай пост до самого конца
              Ответить
    • Что-то я вас не понял, при чём тут вообще восьмеричная система ? От strftime получаем $month в виде числа в диапазоне 01-12, а весь switch - это конструкция из условий типа if ($month == 01) $month="01", т.е. просто перевод числа в строку.
      Ответить
      • Во-первых, не число, а строку. Это важно
        Во-вторых, Попробуйте сравнить 07 == "07" и 09 == "09", результаты будут разные
        В-третьих, говнокод не в этом сравнении. Это так, в учебных целях
        Ответить
      • Уточнение
        Во-первых, strftime возвращает не число, а строку. Это важно
        Ответить
        • ну я сам говонокодер, языка не знаю, мануалы не читаю, и вы правы, strftime возвращает строку
          Ответить
        • strftime то возвращает строку, но в данном случае это не важно.
          Ответить
          • Как раз таки важно. Функция возвращает строку, а сравнивается потом с числом.
            > Во-вторых, Попробуйте сравнить 07 == "07" и 09 == "09", результаты будут разные
            Ответить
    • Ты, видимо, так и не понял, почему результаты разные. 09 не корректная запись, PHP следовало бы выдать ошибку, но он этого не делает, и считает ее равной нулю.
      Ответить
      • Предыдущий камент - к вот этому http://govnokod.ru/2275#comment11606
        Ответить
        • Это я не понял??? Да я на протяжении всех комментов пытаюсь объяснить молодежи, почему не будет работать ветка 09 и 08. Тут только это WGH понимает.
          Читай не последний коммент, а всю ветку

          P.S. Коммент #comment11606 мой
          Ответить
        • А по поводу систем счислений, битовых операций меня учить не надо. Это я уже знал лет в 12, когда самым мощным домашним компьютером был ZX-Spectrum. Но этому я обучился не на компе, а на листке бумаги.
          Это сейчас знание систем счисления сводится только к использованию функции base_convert, но не все смогут перевести из одной системы в другую используя листок и ручку
          Ответить
          • Дабы устранить недоразумения мой комент был к этому :
            > Как раз таки важно. Функция возвращает строку, а сравнивается потом с числом.
            > > Во-вторых, Попробуйте сравнить 07 == "07" и 09 == "09", результаты будут разные
            Написанному под гостем. То что это ты первый обратил внимание на то что числа не в той системе я вижу.
            В общем с учетом выясненного мой камент должен быть таким:
            > Во-вторых, Попробуйте сравнить 07 == "07" и 09 == "09", результаты будут разные
            При чем тут это? Сравни 07 == 7 и 09 == 9, результаты будут такие же разные. Потому что строка в правой части приводится к числу, т.к. в левой части число.
            Ответить
            • Еще добавлю что при сравнении строк PHP использует хитрожопый алгоритм, иначе не назовешь. Сначала он всеми правдами и неправдами пытается привести строку в число. Поэтому, как правило, между строкой приводимой в число и числом нет разницы.
              Если мы сравним "0.0" == "0E0", "0.0" == "0A0", 0.0 == "0A0", то результаты будут разные.
              Если хотя бы один из аргументов число, то он сравнивает оба аргумента как числа. Затем он пытается привести обе строки в числа, если они корректно приводятся, сравнивает их как числа. Иначе он сравнивает аргументы как строки.
              Отсюда вывод, что даже если мы сравниваем две строки, они необязательно будут сравнены как строки. Поэтому во избежании неожиданностей лучше всегда сравнивать строки с помощью strcmp, несмотря на то что использования обычных операторов сравнения и switch дозволяется. То же самое относится и к использованию функции sort без второго параметра, результаты могут быть непредсказуемыми.
              Описанная выше особенность связанна с кривым унаследованием нетипизированости Perl.
              Пожалуй, еще чудо-примерчик "9" == "000000900.000E-2"
              Ответить
            • Вы вообще читали комменты? Первым комментом было 09 != 9. Потом для примера предложил сравнить 09 == "09", потому что переменная $month имеет строковый тип, а сравнивается с числом. Т.е. тоже самое что и сравнить 09 и 9.

              Читайте всё, а не через строчку и включайте мозг, здесь уже все изложено
              Ответить
              • В таком случае определитесь уже
                >>Во-первых, strftime возвращает не число, а строку. Это важно
                >>Как раз таки важно. Функция возвращает строку, а сравнивается потом с числом.
                Или
                >>Нет, именно сравнение чисел
                >>Т.е. тоже самое что и сравнить 09 и 9.
                Ответить
      • An awnser from an expert! Thanks for contributing.
        Ответить
    • Я когда постил, вообще не знал, что числа, начинающиеся с "0" рассматриваются пхп как числа в восьмеричной системе. Что самое интересное, когда-то я писал код, где было похожее условие - т.е. число сравнивалось со строкой с "незначащим" (как я наивно полагал тогда) нулём. И он даже работал O_o. В общем, учиться, учиться и учиться.
      Ответить
      • Нет, в строке с первым нулем (или нулями) нуль действительно будет не значащим. По тому что строка воспринимается как десятичное число.
        9 == "00009"; //тру, т.к. правая часть приводится в 9
        9 ==  00009; //фолс, т.к. правая часть означает не корректную запись в восьмеричной системе исчисления, и считается нулем
        Ответить
        • а, ну тогда мой тот говнокод - "тру" :D, thx за разъяснения
          Ответить

    Добавить комментарий