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

    +174

    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
    // get extension and name
            $ar = explode('.', $result['name']);
            if (count($ar) == 2)
            {
                $fName = $ar[0];
                $fExt  = $ar[1];
            }
            elseif (count($ar) < 2)
            {
                    $fName = $result['name'];
                    $fExt  = '';
            }
            else 
            {
                        $fName = $ar[0];
                        for ($i = 1; $i < count($ar); $i++)
                        {
                            $fName .= '.' . $ar[$i];
                        }
                        $fExt = $ar[count($ar) - 1];
            }

    Вот таким вот образом в проекте вычисляется расширение файла

    PS. Для тех кто в танке:
    method1(using internal function):
    $extension = pathinfo($filename, PATHINFO_EXTENSION);
    method2(coder know about 'explode' function)
    $ar = explode(".", $filename); $extension = count($ar)>1 ? end($ar) : "";
    method3(coder know about 'strchr', 'strrchr' and 'substr' functions)
    $extension = strrchr(".", $filename ) == FALSE ? "" : substr(strrchr(".", $filename));

    Запостил: mykola, 19 Августа 2010

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

    • самый распространенный это method3 =)
      Ответить
    • показать все, что скрытоа какой метод предпочтительней? наверное 3. хотя я обычно решал 2ым
      Ответить
      • вот так люра показал что он пыхозадрот и школомакака, а выебывается
        Ответить
      • дааааа уж, а надо первым методом пользоваться
        P.S. а вообще затея вычислением расширения по-моему лишняя, где оно пригодиться то может..
        Ответить
        • показать все, что скрытоугу, век живи, пыхозадротом от рождения был и помрешь

          ну например проверка при загрузке на определенные расширения файлов
          Ответить
          • тащемто расширения файлов имеют магическое значение только в мире дос/виндоус.

            для юниксоидов это просто кусочек имени, так что серьезно что-то фильтровать по расширению -- глупо имхо
            Ответить
            • надо и по расширению, и по миме-типу.
              Потому что, если мы зауплоудим, скажем, гифку, но без расширения - какой контент-тип тогда слать броузеру, отдавая ее?
              если я что-то не понимаю, пожалуйста, просветите
              Ответить
              • от браузера зависит, думаю что x-application какой-нить пошлет.

                мы же на своей стороне может проверить ее заголовок
                например гифы начинаются как GIF89, зипы как PK итд

                ну для надежности можно и расширение конечно
                Ответить
                • я уже говорю о том случае, по какому миме сервак будет отдавать такой невнятный файл

                  ну этим может заняться и fileinfo

                  для надежности. Потому что на вход и броузер может отослать какой угодно миме. Тот же image/pjpeg
                  Ответить
      • Это ж надо было выбрать ВСЁ кроме того, что нужно. Имхо, случайно такую глупость сморозить довольно таки сложно.

        Сортировать одномерный массив пузырьком будете, а считывать содержимое файла в строку - в цикле?
        Ответить
    • В методе 3 есть копипаст, который зло. И substr() там неправильно вызвана. Самое короткое, пожалуй, будет
      $extension = substr((string) strrchr('.', $filename), 1);

      И да, забыли метод 4 - для поклонников регэкспов:
      $extension = preg_match('/\.([^.]+)$/', $filename, $matches) ? $matches[1] : '';
      Ответить
      • показать все, что скрытокопипаст всегда зло, я про сам подход

        а скорость сейчас замерим...
        Ответить
        • показать все, что скрыто<продолжение>
          ... а замеры показывают, что pathinfo зря я не использовал - она даже быстрее (30 микросекунд) выражений со строковыми функциями. а метод (2) с разделением строки на массив - как и ожидалось, наиболее медленный - 90 микросекунд. метод 3 - 80 микросекунд
          Ответить
          • датычо?
            Ответить
            • показать все, что скрытофакты, просто убедиться.
              вообще я думал, что pathinfo лезет в сам файл, потому будет медленен
              Ответить
              • >>факты, просто убедиться

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

                господа, пора сливать долбоеба макаку, походу это второй вебкилл детектед
                Ответить
    • про metod3 я прогнал, прошу прощения. Почему то думал что strrchr возвращает позицию символа, а эта хрень возвращает подстроку. Правильный вариант
      $extension = substr((string) strrchr($filename, '.'), 1);

      Я заморочился и замерял скорость, мои результаты несколько иные:
      Results: 
      Test #1 duration: 3.017 result: xml name: preg_match
      Test #2 duration: 1.324 result: xml name: strrchr
      Test #3 duration: 1.34 result: xml   name: strrchr2
      Test #4 duration: 1.905 result: xml name: explode
      Test #5 duration: 2.301 result: xml name: pathinfo

      Тестовая строка 'nbpro.ject/pri.vate/private.xml'.

      Суть не в производительности, но читаемости. pathinfo все же имхо наиболее легко воспринимается.
      Ответить
      • Результаты теста preg_match() можно сразу выкидывать. При многократном повторении вызова регулярки в цикле затраты на её однократную компиляцию становятся незаметны, в реальном же приложении они бы сыграли бОльшую роль за счёт на порядки меньшего числа вызовов.
        Ответить
        • э. Я где то писал что "многократно вызывал регулярку"? Вроде не заметил. Каждый тест выполнялся ровно 1 раз. Цифры - какие то милимикросекунды. Я могу выложить сгенерированый тест.
          Ответить
          • зы. понял что неправильно понял :). Да, действительно результаты теста можно выкинуть. Пофих.
            Ответить
    • этот код необходимо использовать только в сочетании с http://govnokod.ru/3956
      Ответить

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