Класс Set — повелитель массивов

    Сегодня кстати, вышел четвертый релиз-кандидат CakePHP 1.2. Более 300 изменений и все такое. Но сейчас речь не об этом.
    Оказывается в недрах CakePHP давно живет класс Set, который активно используется в ядре и редко используется конечными пользователями. А между прочим зря.
    О чем это ты?
    Share post

    Comments 44

      +2
      Имхо, достаточно интересны только diff и combine. Extract легко реализуется с помощью map, имхо, даже функциональнее, с другой стороны а так ли часто нужны diff и прочие? Не поэтому ли этот класс мало популярен?

      Извините за оффтоп, а зачем вам везде конструкция " 'User' => array "? Вроде и так понятно, что массив пользователей, почему бы вместо
      ( 0 => array ( User => array ( id =>, name =>
      не написать
      ( 0 => array ( id=>, name =>
      Ведь каждый уровень вложенности в хешах порождает дополнительные затраты, к тому же в данном случае не нужные.

      Ну и как бы
      $userNames = Set::extract($users, '{n}.name');
      а так же
      $items2 = Set::combine($users, '{n}.name', '{n}.Item.{n}.name');
        +1
        ну я и не говорю, что все методы одинаково полезны, но знать про них не помешает. merge, combine и extract я например часто использую. а 'User' => array, потому что по кэйковским соглашениям его ORM возвращает данные именно в таком виде. вот тут написано.
          +3
          Ага, извините тогда за оффтоп, не в курсе был, просто выглядит странно.
          0
          Потому что могут быть связи моделей
          +1
          Опять, героически решаются вымышленные задачи.
            0
            The cake is a lie.
              0
              а ну-ка поподробнее
                0
                в контексте с CakePHP это даже очень полезная вещь…
                0
                Set::merge — одна из незаменимых вещей, которая используется очень часто.

                  0
                  Кстати стоит отметить, Set::extract гораздо мощнее чем даже описано.
                  С недавних пор его набор параметров поменялся (где-то 1.2 RC или чуть раньше), теперь они выглядят как
                  Set::extract($path, $data, $options)
                  Параметр $options — не является обязательным и в знает только один параметр 'flatten' который по умолчанию активен и редко когда изменяется

                  Самое интересное что теперь в качестве $path можно использовать выражения XPath, далеко не все конечно, но частично поддержка имеется. Примеры из исходного кода:

                    +1
                    «Дурацкая раздевалка» (с), продолжу

                    /User/id (тоже самое что и классическое {n}.User.id)
                    /User[2]/name (выберет поле name для второй записи user)
                    /User[id>2] (выберет всех User с id больше 2)
                    /User[id>2][<5] (выберет всех User с id больше 2, но меньше 5)
                    /Post/Comment[author_name=john]/../name (Выберет название записей Post, у которых есть хотя бы одна запись Comment со значением поля author_name равным john)
                    /Posts[name] (Выберет все записи Post имеющие поле name)
                    /Comment/.[1] (Содержимое первой записи Comment)
                    /Comment/.[:last] (Последняя запись)
                    /Comment/.[:first] (Первая запись)
                    /Comment[text=/cakephp/i] (Все записи у которых поле text соответсвует regex /cakephp/i)
                    /Comment/@* (Получить все поля для всех записей)

                    Кстати, что бы не использовать такой большой код для простых вещей, можно использовать
                    Set::classicExtract, который является старым кодом функции extract
                      +1
                      Интересно, как оно в сравнении с «нативными» dom и xpath в плане производительности?
                      С одной стороны — массивы, должно бы быть полегче. С другой — реализовано-то на PHP…
                        0
                        Не измерял, но опыт подсказывает, что реализация на php, практически всегда медленнее чем сторонним модулем к php. Просто иногда дешевле и проще проиграть в скорости разбора документа (один раз), чем потратить памяти и времени на создание, разбор и уничтожение более быстрого в разборе класса.
                        –5
                        Вау, чуваки портировали jQuery на php:)
                          –1
                          Еще бы chain-ы на уровне jQuery… :)
                        +2
                        Чето уж очень jQuery напоминает :) Вначале идея таких селекторов не впечатляет, а потом, поюзав, может и понравится сильно :) Правда я не собираюсь — Cake не использую.
                          0
                          первый пример ещё можно решить следующим образом:
                          $userNames = array_map(create_function('$item', 'return $item["User"]["name"];'), $users);
                          
                            –1
                            create_function — тормоз
                            –7
                            всё это очень хорошо, но я работаю на Symfony.
                              +1
                              Вы даже не представляете! Но Этот код можно спокойно использовать в любом фреймворке который работает на PHP! =)
                                0
                                под словом «код» имелось ввиду сам класс… достаточно скопировать в свой проект…
                                +5
                                извините, я не знал, в дальнейшем такие посты не повторятся.
                                0
                                Блин, какая интересная штука!
                                А кто-нибудь слышал о чём-нибудь подобном в виде отдельной библиотеки?
                                А то переходить на cake не очень хочется…
                                  0
                                  а потратить 5 минут на выдирание из кейка?
                                    –1
                                    Да нет несложно, но при каждом апдейте снова выдирать и обновляться?
                                    А так может есть в какой-нибудь библиотеке утилит, можно только библиотеку и обновлять.
                                      –1
                                      как будто в пхп мире кто-то активно юзает svn externals или там git submodules какие-нибудь…

                                      ну а если не найдете подобной либы — выдирайте из кейка и оформите как либу. пользу немногочисленному опен сорс сообществу пхп принесете.
                                        –1
                                        Да у него итак зависимостей нет.
                                        Вроде, можно даже наследование от object убрать и использовать…
                                        Не думаю что выкладывание в отдельную либу кому-то нужно.
                                        Если бы была подобная либа, но ещё с какими-нибудь полезными вещами — было бы интересно.
                                        Собственно, я с этой целью и интересоваться начал.
                                        –1
                                        Зачем вам ждать обновлений??? Если она и так хорошо работает.
                                          –1
                                          Ну может не реализовано всё, что хотелось…
                                          Какие-то дополнительные методы или оптимизация текущих.
                                          Даже если в текущем виде работает отлично, всё равно: обновления — полезная вещь, вообще.
                                  • UFO just landed and posted this here
                                      +1
                                      странный комментарий
                                      0
                                      как вовремя, как раз для форм+orm данное решение понадобилось типо «User.Groups.{n}.id», подсмотру как реализовано, но обчно исходники кейка меня пугают :(.
                                        0
                                        это вы еще Codeigniter не смотрели… там было такое
                                        while ($day > 1)
                                        {
                                        $day -= 7;
                                        }
                                          0
                                          расскажите-ка мне, что же там такого страшного, с примерами желательно
                                            0
                                            не придираясь даже к самому коду, который я последний раз смотрел года 2 назад могу сразу сказать о его оснавном недостатке — php 4. у меня на девелоперской машине сразу же валятся E_STRICT. обратная совместимость влечёт за собой кучу старых костылей и не использование новых фич типо spl. Могу написать и комменты к коду, но нужно пересмотреть исходники, и не сейчас, а «весёлое» можно и нагуглить.
                                          0
                                          Самое частоиспользуемое для меня Set::extract
                                            0
                                            не класс, а неймспейс.
                                              0
                                              Идеологически да, но технически, зачем-то авторы сделали его наследником от своего же Object.
                                            • UFO just landed and posted this here
                                                +7
                                                вроде у них лицензия не запрещает пользоваться фреймворком секс меншинствам, так что не боись, пользуйся на здоровье.
                                                0
                                                извиняюсь за оффтоп, а как можно уменьшить тормознутость кейка (1.2)?
                                                Мне очень не нравится, что request time пустой страницы около 5 сек, а с выдиранием данных из модели — до 7 секунд (хотя при это вместе с DESCRIBE на sql тратится до 80ms)
                                                  0
                                                  ну если DESCRIBE, то значит это отладочный режим, а в нем вовсе не производительность важна. отключи дебаг, будет быстро. если в продакшене медленно работает, проверь права на app/tmp. если хочется производительности при отладке, то имеет смысл поставить apc (акселератор пхп) и велеть его использовать:
                                                  Cache::config('default', array('engine' => 'Apc'));
                                                  да и в продакшене не помешает =)

                                                  а вообще на моем ноуте (Core 1.8) в дебаге время генерации страницы — 500-700мс, в релизе с кэшем — 150-200мс.
                                                    0
                                                    и с отключенным дебагом долго тоже
                                                    да и дело в том, что не только на моем ноуте так тормозит (ADMx2 1.8), а и на платном хостинге.
                                                    А можно с Вами проконсультироваться за пределами комментариев?
                                                      0
                                                      да, можно. в профиле icq и jabber.

                                                Only users with full accounts can post comments. Log in, please.