Как стать автором
Обновить

Комментарии 44

Имхо, достаточно интересны только 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');
ну я и не говорю, что все методы одинаково полезны, но знать про них не помешает. merge, combine и extract я например часто использую. а 'User' => array, потому что по кэйковским соглашениям его ORM возвращает данные именно в таком виде. вот тут написано.
Ага, извините тогда за оффтоп, не в курсе был, просто выглядит странно.
Потому что могут быть связи моделей
Опять, героически решаются вымышленные задачи.
The cake is a lie.
а ну-ка поподробнее
в контексте с CakePHP это даже очень полезная вещь…
Set::merge — одна из незаменимых вещей, которая используется очень часто.

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

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

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

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

ну а если не найдете подобной либы — выдирайте из кейка и оформите как либу. пользу немногочисленному опен сорс сообществу пхп принесете.
Да у него итак зависимостей нет.
Вроде, можно даже наследование от object убрать и использовать…
Не думаю что выкладывание в отдельную либу кому-то нужно.
Если бы была подобная либа, но ещё с какими-нибудь полезными вещами — было бы интересно.
Собственно, я с этой целью и интересоваться начал.
Зачем вам ждать обновлений??? Если она и так хорошо работает.
Ну может не реализовано всё, что хотелось…
Какие-то дополнительные методы или оптимизация текущих.
Даже если в текущем виде работает отлично, всё равно: обновления — полезная вещь, вообще.
Исключительно мое личное мнение:

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

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

Публикации