Итак, вы правы, что PHP не поддерживает это «из коробки» (кроме своего рода, см. Ниже) Первый язык, который я знаю об этом, - Objective-C (ну, по крайней мере, библиотека CoreFoundation). NSArrays и другие наборы имеют методы (в одной строке) указать, что a given method should be executed on all members; и даже более крутой (для меня, по крайней мере) есть концепция «keypaths» и support that NSArray, а у других есть для них. Пример; позволяет сказать, что у вас есть массив «людей», каждый из которых имеют родителей, которые, в свою очередь, имеют «имя»:
arrayOfNames = [peopleArray valueForKeyPath:"parent.name"];
arrayOfNames теперь массив всех имен родителей.
Ближайшая вещь PHP имеет array_map, которую вы можете использовать вместе с анонимными функциями, чтобы очень быстро взбить что-то вместе.
редактировать анекдотический, как это может быть, следует помнить, что структуры цикла не нужно их фигурные скобки, если есть только один оператор для выполнения; поэтому любые причудливые решения должны конкурировать с этим:
foreach($players as $p) $p->score += 40;
И я упомянуть глубокое решение для тех поклонников OOP там ... Если вы работаете с коллекцией объектов вместо массивов, мир ваш устрица с такими вещами. Самое простое понятие, которое приходит на ум, это магия php's __call()
. Как просто перебирать своих участников и делать это для ваших пользователей? Для большего контроля вы можете реализовать несколько разных стратегий для итерации (один для преобразований, один для фильтров и т. Д. Разница - это то, что возвращается, по существу). Таким образом, в теории можно создать несколько различных классы итераторов, и в вашем «основном» классе коллекции реализовать методы пары, чтобы получить один из них, которые будут предварительно инициализированы с содержимым:
$players->transform()->addScore(40);
где преобразование () возвращает экземпляр вашего итератора «Не возвращайте массив», который использует метод __call().
Небо начинает открываться в этот момент, и вы можете начать строить фильтр итераторы, которые принимают предикаты и возвращают другую коллекцию подмножества объектов, и синтаксис, как это возможно:
// send flyer to all parents with valid email address
$parentsPredicate = new Predicate('email');
$players->filteredByPredicate($parentsPredicate)->each()->email($fyler_email_body);
«NSArrays и другие наборы имеют ** методы ** ...» любые ссылки на эти методы? – jolt
Я добавил ссылки на ответ. Если вы входите в это на концептуальном уровне, вы также можете по-настоящему копать в своем ключевом значении кодирование в целом, оно очень глубоко интегрировано повсюду, а затем их реализация «наблюдения за ключ-значение» (а не iOS еще) добавляет способность к гибкости. Один из моих любимых читает о реализации какао всего этого (и общих моделей ООП/Дизайн): http://www.amazon.com/Cocoa-Design-Patterns-Erik-Buck/dp/0321535022/ref=sr_1_1? ы = книги & т.е. = UTF8 & QID = 1346397985 & шаблоны стер = 1-1 & ключевые слова = какао + дизайн + –