使用 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,因此我们在条件中检查它。