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

    +58

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    $arrNotViewDeathWindow = array(
    			'/reklama/press/index.php' => '1',
    			'/reklama/press/' => '1',
    			'/reklama/product/index.php' => '1',
    			'/reklama/product/' => '1',
    			'/about/poll/' => '1',
    			'/about/poll/index.php' => '1',
    			'/about/poll/result.php' => '1',
    			'/reklama/product/orders_list.php' => '1',
    		);
    
    if(!$arrNotViewDeathWindow[$_SERVER['SCRIPT_NAME']]) ...

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

    Запостил: Cool-Di, 04 Июля 2012

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

    • Строчка if(!$arrNotViewDeathWindow[$_SERVER['SCRIPT_NAME']]) - говнокод, но решение адекватное. Не вижу проблемы.
      Можно, как вариант использовать
      $arrNotViewDeathWindow = array(
      	'/reklama/press/index.php',
      	'/reklama/press/',
      	'/reklama/product/index.php',
      	'/reklama/product/',
      	'/about/poll/',
      	'/about/poll/index.php',
      	'/about/poll/result.php',
      	'/reklama/product/orders_list.php'
      );
      if (in_array( $_SERVER['SCRIPT_NAME'], $arrNotViewDeathWindow)) ...

      Но особой разницы не вижу.
      Ответить
      • да, в рамках этого куска особо не исправишь.
        но думаю, можно страницы проверять не по url, а то и вообще в сами страницы и вставить...
        Ответить
      • Я решил, что в том то и говнокод, информацию программист хранит в ключах массива, а не в значениях массива. C in_array() работать как минимум логичнее.
        Ответить
        • А если нужно убирать элементы из массива?
          Нашёл --> убрал, например.
          Ответить
        • А пробовали вы искать в больших массивах с помощью in_array() ? Очень медленно работает!
          А вот array_key_exists() или isset() работает мгновенно.
          К тому же я считаю, что автор этого кода поступил абсолютно правильно, т.к. есть возможность в значения массива закинуть какие нибудь параметры. Единственное я бы написал:
          if(empty($arrNotViewDeathWindow[$_SERVER['SCRIPT_NAME']])) ...
          Ответить
    • Кстати спросить: а кто-нибудь, когда-нибудь задавался ли мыслью о том, чтобы в ПХП внедрить какое-нибудь разнообразие в смысле типов коллекций? Ну, например, добавить нормальную хеш-таблицу, или мапу, или словарик, там или дерево? Просто сколько примеров кода вижу - всегда массивы используют.
      Ответить
      • А чем PHP массив не мапа?
        Ответить
        • А я не знаю - а что он с ключами делает?
          Ответить
          • Выдержка из мана: An array in PHP is actually an ordered map.
            А реализованы они, если верить документации, через хэш-таблицу.

            > А я не знаю - а что он с ключами делает?
            PHP arrays can contain integer and string keys at the same time as PHP does not distinguish between indexed and associative arrays. Причем строки, которые можно распарсить как десятичные числа, работают точно так же как и сами числа: a[2] == a["2"].
            Ответить
            • Ну, как бы уже тем, что существует, вобщем-то, только StringHash или как-то так. Иногда хотелось бы что-то другое в качестве ключей использовать.
              Кроме того, если ordered, то нужно понимать, что есть пеня за это, либо доступ к эелементам не за O(1), как, естественно, хотелось бы в хеш-мапе. Опять же, ordered - в порядке добавления, или в порядке сортировки (какой-нибудь, но если строки, то, наверное, лексикографической). Если в порядке сортировки - то, опять же, за это наверняка платят чем-то, либо при добавлении, либо при чтении.
              Ответить
              • В порядке добавления. Насколько понимаю там что-то типа вектора для хранения и хэш-индекса для поиска за О(1).
                Ответить
                • Тогда такой номер:
                  $array = array();
                  $array[9] = 0;
                  $array[8] = 1;
                  $array[7] = 2;
                  . . .
                  $array[0] = 9;
                  foreach ($array => $key as $value) {
                          echo "$key => $value";
                  }

                  неужели распечатает в обратном порядке? Или он числа использует как хеши? Или как?
                  Ответить
                  • Для этого нужно ksort сделать сначала.
                    Ответить
                  • Распечатает именно как введено - 9 => 0 ... 0 => 9. Через asort() можно отсортировать его по значениям, а через ksort() по ключам. Есть еще sort(), но он сортирует только по значениям, убивая ключи, вернее расставляя вместо них возврастающие числа, начиная с нуля.
                    Ответить
                    • Ну так в таком случае фиг с ней с мапой, просто массив обычный и то не плохо было бы...
                      Ответить
                      • Ну да, согласен, массив без оверхеда не помешал бы.

                        Хотя если с другой стороны посмотреть - многие пхпшники и с одним массивом разобраться не могут, куда им еще дополнительные контейнеры...
                        Ответить
                        • Похоже на попытку сэкономить на спичках то, что пропито на пиве.
                          Ответить
                          • > Похоже на попытку сэкономить на спичках то, что пропито на пиве.
                            Время? ;)
                            Ответить
                            • губит людей не пиво.

                              а вообще эти карто-массивы в пхп дерьмовые.
                              например, числовые ключи воспринимаются как индексы, поэтому можно получить нежданчик.
                              Ответить
                              • Идёт программист по PHP. Идёт, никого не трогает. И тут из-за угла на него как выскочит нежданчик! Программист так перепугался, что чуть С не отбросил.
                                Ответить

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