索引数组foreach简写



数据:

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

通常,为了从数组中的每个对象中得到一些东西,我们必须使用for/foreach。

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

但是,由于这是一项重复性任务,有没有办法沿着这些假想线将其缩短到某个位置(?)

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

由于我还没有见过php的这样一个功能,有没有实现它的方法

我已经用php作为主要语言提出了这个问题,但语言不可知论和编程语言代表了问题的第二部分:哪些语言支持这样或至少类似的简写

因此,PHP不支持这种"开箱即用"的做法是正确的(除了kinda,请参阅下文)。我所知道的第一种语言是Objective-C(至少是CoreFoundation库)。NSArray和其他集合有方法(在一行中)指示给定的方法应该在所有成员上执行;更酷的是(至少对我来说)"关键路径"的概念以及NSArray和其他公司对它们的支持。一个例子;假设你有一组"人",每个人都有一个父母,他们又有一个"名字":

arrayOfNames = [peopleArray valueForKeyPath:"parent.name"];

arrayOfNames现在是所有父级名称的数组。

PHP拥有的最接近的东西是array_map,您可以将其与匿名函数一起使用,以非常快速地将某些东西组合在一起。

编辑尽管可能是轶事,但应该记住,如果只有一条语句要执行,则循环结构不需要它们的大括号;因此,任何更花哨的解决方案都需要与之竞争:

foreach($players as $p) $p->score += 40;

我会提到一个更深入的解决方案,适用于那些OOP粉丝。。。如果你使用集合对象而不是数组,那么像这样的东西世界就是你的牡蛎。脑海中浮现的最简单的概念是php的魔术__call()方法。迭代您的成员并为您的用户进行调用有多简单?为了获得更多的控制,您可以实现一些不同的迭代策略(一个用于转换,一个用于过滤器等。本质上,差异是返回的内容)。因此,从理论上讲,您可以创建几个不同的迭代器类,并在您的"main"集合类中实现几个方法来获得其中一个迭代器,这些方法将使用以下内容进行预初始化:

$players->transform()->addScore(40);

其中transform()返回"不返回数组"迭代器的一个实例,该迭代器使用__call()技术。

这时天空开始开放,您可以开始构建过滤器迭代器,它接受谓词并返回对象子集的另一个集合,这样的语法是可能的:

// send flyer to all parents with valid email address
$parentsPredicate = new Predicate('email');
$players->filteredByPredicate($parentsPredicate)->each()->email($fyler_email_body);

你可以做:

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

最新更新