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

    +168

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    if (!is_array($arFilter)) 
    			$filter_keys = Array();
    		else
    			$filter_keys = array_keys($arFilter);
    
    		for ($i=0; $i<count($filter_keys); $i++)
    		{
    			$key = strtoupper($filter_keys[$i]);
    			$val = $arFilter[$filter_keys[$i]];
    // ....
    }

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

    Запостил: belukov, 12 Октября 2011

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

    • а кто не знает про форич в пхп так и делают. да, именно так.
      Ответить
    • > по всей видимости, в битриксе программистам выдают тяжелые наркотики
      Ничё, скоро RIW'11 - по выступлениям битриксоидов и узнаем...
      чё им там выдают
      Ответить
    • «Битрикс» - Чем больше мы напишем, чем тяжелее система, тем выше наши «зарплаты», и более высокое доверие клиентов, ведь мы же «Битрикс»!
      Я думаю начнут они выпускать ОС за 1.000.000 люди покупать будут, ведь такая цена, значит качество! И ведь это же 1С!
      Ответить
    • Ыыыыыыыыыыыыыыыыыыыыыыыыыыы
      Ответить
    • интересно, что эти тяжелые наркотики ими не только рекомендованы, но и задокументированы (http://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=3044):
      «В любом языке программирования существуют так называемые идиомы, то есть повсеместно применяемые способы использования тех или иных конструкций. Например, в языке PHP к таким идиомам можно отнести форму записи цикла по элементам массива:
      for ($i = 0, $cnt = count($arArray); $i < $cnt; $i++)
      {
      }

      или
      foreach ($arArray as $key => $value)
      {
      }
      »
      Ответить
      • И в чем тут проявляется тяжелая наркотическая зависимость?
        Ответить
        • В том что ты так тур что даже не понял что фор не нужен если есть форыч.

          Они б ещё Кайл добавили
          Ответить
          • Не Кайл а вайл
            Ответить
          • "for не нужен", запомню на будущее. Жалко, что ты под маской анонима скрываешься, было бы неплохо знать ник, чтобы цитату подписывать:)

            В чем проблема, напиши авторам пыха, чтобы фор и вайл убрали из языка, foreach же есть:)
            Ответить
            • PHP не знаю, единственное оправдание for ($i = 0, $cnt = count($arArray); $i < $cnt; $i++)- если там нет foreach по ссылке, т.е. с foreach нельзя присваивать элементы, а с этим циклом можно. А если используют только для чтения - упоротые мартышки, да.
              Ответить
              • > нет foreach по ссылке
                Есть там foreach по ссылке. Он, правда, немного ёбнутый. Но если знать про одну багофичу - вполне рабочий.
                Ответить
              • Внезапно помимо значений элементов массива могут понадобиться соответствующие индексы.

                Как ты будешь решать задачу "найти индекс минимального элемента в массиве", иксперт?
                Ответить
                • > массива
                  foreach ([42,100500, 13] as $i => $v) вполне нормально обойдет все элементы массива. В $i будут индексы (0,1,2), в $v - значения (42,100500,13).

                  Правда порядок обхода может сбоить из-за того, что foreach обходит элементы в порядке их вставки в array.
                  Ответить
                  • А, ну в пыхе может быть. В какой-нибудь жаве не так, там из foreach не заменит for. Но ведь гость признался
                    > PHP не знаю
                    Ответить
                  • Кстати, мне понравилось, что в php обход массива форычем и доступ по индексу сделаны через разные интерфейсы (Iterator из ядра и ArrayObject из Spl соответственно). Можно создать класс, реализующий эти два интерфейса, так что обходы с помощью for и с помощью foreach будут давать разные результаты.
                    Ответить
                    • > обходы с помощью for и с помощью foreach будут давать разные результаты
                      Да можно и не создавать класс. Ибо они и на самом обычном array дают разные результаты.
                      Ответить
                      • потому что не всегда понятно с чем мы иеем дело -- с обычным арреем или ассоциативным
                        Ответить
                        • Да никогда не понятно. Даже если индексы только числовые. Эта гибридная структура - всё-таки зло. Отдельный нормальный массив не помешал бы.
                          $a = array();
                          $a[2] = 42;
                          $a[0] = 100500;
                          $a[1] = 13;
                          // форич покажет их именно в таком порядке
                          Ответить
                          • Потому везде массив (лист) явно отличается от мапы (дикта, хеша, ассоциативного массива). Везде: perl, java, c#, ruby, python
                            И только пых как всегда.
                            Ответить
                            • Ну еще в js умудрились смешать мапу и объект.
                              Ответить
                              • Да, это тоже очень плохо. Но все таки не так плохо: массив там это как-бы класс.
                                Ответить
                    • бухахахах))за это мы и любим пхп)))
                      Ответить
              • Единственное нормальное применение foreach - это обход массива с известной размерностью. Для остальных случаев как раз есть while и for.

                Боюсь, мартышка тут ты:(
                Ответить
                • Это типа массив, про который мы не знаем двумерный он или трехмерный? Откуда такие массивы вообще берутся, от пользователя что ли приходят?
                  Ответить
                  • Древовидные структуры всякие могут быть)
                    Ответить
                  • А JSON какой-нибудь или что подобное?
                    P.S. Анонимус уже всё сказал.
                    Ответить
                    • Мы тут все сидим и обсуждаем тот факт, что циклы, созданные посредством конструкций while и for бывают полезны при обходе различных структур данных. С ума сойти!
                      Ответить
                      • Верно подмечено.

                        А вообще, за время срача полилога забываются предыдущие реплики, запоминаются только некоторые моменты из последней. Отвечаешь на эти моменты, тебе отвечают на твои моменты (а не на суть). И наступает момент, когда оглядываешь дерево комментариев целиком, а там безудержное БЕЗУМИЕ.
                        Ответить
                  • Видимо неправильно выразился - обход массива известной длины. А когда надо другие данные циклически обойти, без for или while не обойтись.

                    С таким же успехом можно switch предложить запретить к использованию:(
                    Ответить
                    • а бывает массив неизвестной длины?;)
                      Ответить
                      • Бывают. Например, массив всех чисел Фибоначчи.
                        Ответить
                        • Мы говорим о ЯП все таки:) Массив есть структура данных в памяти, имеющая четкий размер. Массив чисел Фибоначчи будет реализован через паттерн итертор (см банду четырех). Тоесть нечто, у чего есть метод next() и проверка hasNext() которая (в случае Фибоначчи) всегда будет возвращать false.
                          Ответить
                      • Не знаю, как в PHP, но нечто с итераторами, char* в C и бесконечные списки в ФП можно считать массивами неизвестной длины.
                        Ответить
                        • >> char* в C
                          чойто неизвестной? Я вот прогуляюсь до первого NULLа, и все узнаю.

                          Про итераторы см мой коммент выше
                          Ответить
                          • > Я вот прогуляюсь до первого NULLа, и все узнаю
                            Тонкая грань. Если развивать дальше, то все массивы/списки/другие структуры данных имеют известную длину, но её иногда нельзя вычислить (вообще или за заданное время). И последнее слово будет за применимостью теории.
                            Ответить
                            • Ладно, вот Вам другое определение: массив поддерживает random access, а итератор -- нет. char* такой access поддерживает, как Вы понимаете (арифметика указателей, все дела)
                              --------
                              Ну вот вам педивикия:

                              In computer science, an array data structure or simply an array is a data structure consisting of a collection of elements (values or variables), each identified by at least one array index or key. An array is stored so that the position of each element can be computed from its index tuple by a mathematical formula.
                              Ответить
                              • >> by a mathematical formula.
                                Сиречь не только со случайным доступом но и с константным временем доступа. Ну типа НачалоМассива+(РазмерЯчейки*Индекс)

                                Таким вот образом становица понятно что ни фибоначчи ни stdout тут нипричием
                                Ответить
                                • Какой-то массив нехороший выходит, если понимать буквально.
                                  Задам я "НачалоМассива+(РазмерЯчейки*Индекс + [E^Индекс])" - и будет тот же массив, но жуть какой реееедкий.
                                  Или задам "НачалоМассива+(РазмерЯчейки*[10*sin(Индекс)])" - тоже массив выйдет. Даже с бесконечной длиной.
                                  А если слишком строгое определение сделать, массивы с выравниванием не попадут.
                                  Ответить
                              • Да я, в общем-то, не против Ваших утверждений и Википедии. Не подходят мои примеры под понятие "массив" - ладно. Не массив - так не массив.
                                А известность длины char* - это уже либо проблемы производительности (хотим ли мы терпеть O(n)?) либо математические (я могу - и значит мне известно). Лично я склоняюсь к первому варианту (практическому), но окончательно от второго не отошёл.
                                Ответить
                                • char* попадает, так как все условия выполнены (структура в памяти из однотипных элементов со случайным доступом по индексу за O(1), ну а кто перелетит через хвост массива -- тот сам себе segmentation fault).

                                  Я правильно понимаю что согласно Вашей точки зрения функцию "strlen" из string.h надо запретить?)))

                                  ps: иногда можно хранить размер для скорости привет, паскаль. Знаете такие сигнатуры (char* str, int len) ?
                                  Ответить
                                  • > Я правильно понимаю что согласно Вашей точки зрения функцию "strlen" из string.h надо запретить?)))
                                    Нет, не надо запрещать.

                                    > ps: иногда можно хранить размер для скорости привет, паскаль.
                                    Вот как раз надо использовать строки, которые хранят длину (или самим хранить), если длина вычисляется слишком медленно.

                                    > Знаете такие сигнатуры (char* str, int len) ?
                                    Некоторые такие знаю, но в них len - максимальная длина. Хотя, суть понял.
                                    Ответить
                                    • >> Вот как раз надо использовать строки, которые хранят длину (или самим хранить)

                                      Ну мне кажется что если человек пишет на plain c, то наверное он делает что-то ужасно низкоуровневое и специализированное, и порою может позволить себе не делать безопасных строк. Во всех остальных случаях (начиная от std::string ЕМНП и выше к java, c# и python/perl/ruby) всё и так хранит в себе длину.
                                      Ответить
                                    • Вся Ваша проблема в том, что Вы - программист с душой поэта. Это трудно совмещать (
                                      Ответить
                                      • От скрещивания поэта и программиста родился язык perl
                                        Ответить
                                        • Скорее от мастерицы узелкового письма и программиста.
                                          Ответить
                                          • Программы на перле и правда похожи на стихи.
                                            1) Они должны быть максимально разными. Скучно когда ты пишешь однообразно.
                                            2) Они должны быть такими, чтоб дух захватывало, а не унылыми.
                                            3) Их должны понимать не многие, а только те, с кем ты совпал. Остальные должны считать их полной чушью.
                                            Ответить
                      • Причем тут массив неизвестной длины? Насколько знаю, такого нет.

                        Давай запретим for и while, как предлагает достопочтимый гость.
                        А теперь, считай мне, пожалуйста, входные данные со stdin.
                        Ответить
                        • >>обход массива известной длины
                          >>Причем тут массив неизвестной длины?

                          Запрещать конечно же ничего не надо) Гость видимо имел ввиду что непонятно зачем использовать for, если есть foreach. Но товарищи выше объяснили уже что ввиду каши из массивов обычных и ассоциативных в PHP оба подхода нужны, так как for+count это гарантия обхода структуры как массива, а не как хеша.

                          Данные с stdin не имеют отношения к массиву.
                          Не нужно называть массивом все, по чему можно итерироваться.
                          Ответить
                          • Я уже понял, что гость имел ввиду, просто гость имеет привычку обобщать, а я имею привычку к таким придираться.

                            Цитировать меня ни к чему, форич может быть применен только к массиву (или объекту, реализовавшему интерфейс итератора), а вот для остального как раз и остались for и while, и их запрещать ну никак нельзя. Даже без банальных счетчиков можно остаться:)
                            Ответить
                        • > А теперь, считай мне, пожалуйста, входные данные со stdin.
                          Запретим while, добавим stdin на итераторах, будем гонять форычом по итераторам. В C++ так уже можно.
                          Или запретим while и оптимизируем хвостовую рекурсию...
                          Ответить
                          • Да ну вас нафиг, это если я реализовываю какой-нибудь объект типа ресурс,то я должен еще и об итеративности его задумываться?
                            Ответить
                            • В некотором смысле удобно. map/reduce/filter а также любые (почти. всё же, сортировка бесконечного списка затянется) универсальные будут автоматически работать на наших данных, вместо while/for/forEach будет только один вариант, который будет использоваться всегда. Всеобщая унификация, переиспользование и светлое будущее.
                              Ответить
                          • stdin же стрим в плюсах (как и везде, практически) а значит его можно обернуть итератором и чистать последовательно. Но только лишь последовательно, рендомно нельзя. И потому stdin не массив.
                            Ответить
    • показать все, что скрытоvanished
      Ответить

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