Комментарии 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');
Извините за оффтоп, а зачем вам везде конструкция " '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 возвращает данные именно в таком виде. вот тут написано.
Потому что могут быть связи моделей
Опять, героически решаются вымышленные задачи.
Set::merge — одна из незаменимых вещей, которая используется очень часто.
Кстати стоит отметить, Set::extract гораздо мощнее чем даже описано.
С недавних пор его набор параметров поменялся (где-то 1.2 RC или чуть раньше), теперь они выглядят как
Set::extract($path, $data, $options)
Параметр $options — не является обязательным и в знает только один параметр 'flatten' который по умолчанию активен и редко когда изменяется
Самое интересное что теперь в качестве $path можно использовать выражения XPath, далеко не все конечно, но частично поддержка имеется. Примеры из исходного кода:
С недавних пор его набор параметров поменялся (где-то 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
/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…
Вау, чуваки портировали jQuery на php:)
Чето уж очень jQuery напоминает :) Вначале идея таких селекторов не впечатляет, а потом, поюзав, может и понравится сильно :) Правда я не собираюсь — Cake не использую.
первый пример ещё можно решить следующим образом:
$userNames = array_map(create_function('$item', 'return $item["User"]["name"];'), $users);
всё это очень хорошо, но я работаю на Symfony.
Блин, какая интересная штука!
А кто-нибудь слышал о чём-нибудь подобном в виде отдельной библиотеки?
А то переходить на cake не очень хочется…
А кто-нибудь слышал о чём-нибудь подобном в виде отдельной библиотеки?
А то переходить на cake не очень хочется…
а потратить 5 минут на выдирание из кейка?
Да нет несложно, но при каждом апдейте снова выдирать и обновляться?
А так может есть в какой-нибудь библиотеке утилит, можно только библиотеку и обновлять.
А так может есть в какой-нибудь библиотеке утилит, можно только библиотеку и обновлять.
как будто в пхп мире кто-то активно юзает svn externals или там git submodules какие-нибудь…
ну а если не найдете подобной либы — выдирайте из кейка и оформите как либу. пользу немногочисленному опен сорс сообществу пхп принесете.
ну а если не найдете подобной либы — выдирайте из кейка и оформите как либу. пользу немногочисленному опен сорс сообществу пхп принесете.
Зачем вам ждать обновлений??? Если она и так хорошо работает.
Исключительно мое личное мнение:
Я уже очень давно открыл для себя ООП, а вместе с ним и инкапсуляцию. Все держу в объектах… а уж методами (либо написанными самому под нужды, либо предоставленными фреймворком) можно творить и не такие «удивительные» вещи.
Я уже очень давно открыл для себя ООП, а вместе с ним и инкапсуляцию. Все держу в объектах… а уж методами (либо написанными самому под нужды, либо предоставленными фреймворком) можно творить и не такие «удивительные» вещи.
как вовремя, как раз для форм+orm данное решение понадобилось типо «User.Groups.{n}.id», подсмотру как реализовано, но обчно исходники кейка меня пугают :(.
это вы еще Codeigniter не смотрели… там было такое
while ($day > 1)
{
$day -= 7;
}
while ($day > 1)
{
$day -= 7;
}
расскажите-ка мне, что же там такого страшного, с примерами желательно
не придираясь даже к самому коду, который я последний раз смотрел года 2 назад могу сразу сказать о его оснавном недостатке — php 4. у меня на девелоперской машине сразу же валятся E_STRICT. обратная совместимость влечёт за собой кучу старых костылей и не использование новых фич типо spl. Могу написать и комменты к коду, но нужно пересмотреть исходники, и не сейчас, а «весёлое» можно и нагуглить.
Самое частоиспользуемое для меня Set::extract
не класс, а неймспейс.
НЛО прилетело и опубликовало эту надпись здесь
извиняюсь за оффтоп, а как можно уменьшить тормознутость кейка (1.2)?
Мне очень не нравится, что request time пустой страницы около 5 сек, а с выдиранием данных из модели — до 7 секунд (хотя при это вместе с DESCRIBE на sql тратится до 80ms)
Мне очень не нравится, что request time пустой страницы около 5 сек, а с выдиранием данных из модели — до 7 секунд (хотя при это вместе с DESCRIBE на sql тратится до 80ms)
ну если DESCRIBE, то значит это отладочный режим, а в нем вовсе не производительность важна. отключи дебаг, будет быстро. если в продакшене медленно работает, проверь права на app/tmp. если хочется производительности при отладке, то имеет смысл поставить apc (акселератор пхп) и велеть его использовать:
Cache::config('default', array('engine' => 'Apc'));
да и в продакшене не помешает =)
а вообще на моем ноуте (Core 1.8) в дебаге время генерации страницы — 500-700мс, в релизе с кэшем — 150-200мс.
Cache::config('default', array('engine' => 'Apc'));
да и в продакшене не помешает =)
а вообще на моем ноуте (Core 1.8) в дебаге время генерации страницы — 500-700мс, в релизе с кэшем — 150-200мс.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Класс Set — повелитель массивов