Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Функциональное разделение массивов
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Поскольку часто бывает нужно превосходить возможности array_filter, которая лишь фильтрует массив по некоторой функции, а писать каждый раз array_map - это не dry-подход, я использую простую функцию
Все, что она делает - применяет callback ко всем элементам массива и возвращает результирующий массив, в котором данные сгруппированы в соответствии со значениями этой функции. При этом есть возможность сохранения значения группирующей функции в ключах результирующего массива. Разумеется, это получится сделать, если эта функция возвращает скаляр, либо объект, который имеет метод строкового представления. В иных случаях при использовании опции возврата ключей эта функция даст null.
Пример:
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
DeepVarvar пишет:
Я честно забыл с какой версии доступно такое обращение именно к функциям?
5.3 ?
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
esterio
Отправлено: 04 Февраля, 2013 - 17:56:14
Активный участник
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
DeepVarvar
Кажется такое и в 4-ой версии доступно было. Только интересует такое - такой ж подход нельзя применит к обьектам? тоесть мб лучше call_user_func?
EuGen
Отправлено: 04 Февраля, 2013 - 18:00:15
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Еще с php 4. По-хорошему, нужно еще делать проверку is_callable и возвращать null, если была неудача.
И - да, код можно улучшить с помощью call_user_func. Хотя у меня есть вариант рекурсивного вызова, когда группировка ведется по нескольким значениям - с использованием такого подхода. Позже предоставлю и его.
upd. "рекурсивный" вариант оказался неактуален, поскольку применяется к двумерным массивам и может быть заменен соответствующим callback-вызовом для этой функции.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.