2012-08-31 4 views
0

данных:индексированный массив Еогеасп обсчитывать

$players = array(
    new Player('psycketom'), 
    new Player('stackexchanger'), 
    new Player('max') 
); 

Обычно для того, чтобы получить что-то из каждого объекта в массиве, мы должны использовать /.

foreach ($players as $player) 
{ 
    var_dump($player->score); 
} 

Но, так как это повторяющаяся задача, есть способ комбинациям его к чему-то вдоль этих воображаемых линий (?):

var_dump(every($players)->score); 

every($players)->score += 40; 

Поскольку я не видел такую ​​функцию для , Есть ли способ его реализовать?

Я задал этот вопрос, используя в качестве основного языка, но и стенд для второй части вопроса и : , что языки поддерживают такие или, по крайней мере похожи стенографии?

ответ

2

Итак, вы правы, что 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); 
+0

«NSArrays и другие наборы имеют ** методы ** ...» любые ссылки на эти методы? – jolt

+0

Я добавил ссылки на ответ. Если вы входите в это на концептуальном уровне, вы также можете по-настоящему копать в своем ключевом значении кодирование в целом, оно очень глубоко интегрировано повсюду, а затем их реализация «наблюдения за ключ-значение» (а не iOS еще) добавляет способность к гибкости. Один из моих любимых читает о реализации какао всего этого (и общих моделей ООП/Дизайн): http://www.amazon.com/Cocoa-Design-Patterns-Erik-Buck/dp/0321535022/ref=sr_1_1? ы = книги & т.е. = UTF8 & QID = 1346397985 & шаблоны стер = 1-1 & ключевые слова = какао + дизайн + –

1

Вы можете сделать:

var_dump(array_map(function($el){return $el->score;}, $players)); 

array_walk($players, function($el) {$el->score += 40;}); 
+0

Ну да, но это не так выразительно, как могло бы быть. – jolt

Смежные вопросы