使用 reduce()

reduce 方法将集合减少为单个值,将每次迭代的结果传递给后续迭代。请参阅 reduce 方法

reduce 方法使用集合循环遍历每个项目,并为下一次迭代生成新结果。最后一次迭代的每个结果都通过第一个参数传递(在以下示例中,如 $carry)。

该方法可以对大型数据集进行大量处理。例如以下示例,我们将使用以下示例学生数据:

 $student = [
    ['class' => 'Math', 'score' => 60],
    ['class' => 'English', 'score' => 61],
    ['class' => 'Chemistry', 'score' => 50],
    ['class' => 'Physics', 'score' => 49],
];

总结学生的总分

$sum = collect($student)
    ->reduce(function($carry, $item){
        return $carry + $item["score"];
    }, 0);

结果:220

说明:

  • $carry 是上次迭代的结果。
  • 第二个参数是第一轮迭代中$ carry 的默认值。这种情况下,默认值为 0

如果所有分数> = 50,请通过学生

$isPass = collect($student)
    ->reduce(function($carry, $item){
        return $carry && $item["score"] >= 50;
    }, true);

结果:false

说明:

  • $ carry 的默认值为 true
  • 如果所有分数都大于 50,则结果将返回 true; 如果少于 50,则返回 false。

如果得分<50,则失败

$isFail = collect($student)
    ->reduce(function($carry, $item){
        return $carry || $item["score"] < 50;
    }, false);

结果:true

说明:

  • $ carry 的默认值为 false
  • 如果任何分数小于 50,则返回 true; 如果所有分数都大于 50,则返回 false。

返回得分最高的主题

$highestSubject = collect($student)
    ->reduce(function($carry, $item){
        return $carry === null || $item["score"] > $carry["score"] ? $item : $carry;
    });

结果:[ "subject" => "English", "score" => 61 ]

说明:

  • 在这种情况下不提供第二个参数。

  • $ carry 的默认值为 null,因此我们在条件中检查它。