Laravel 使用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;否则,结果将返回true。如果小于50,则返回false。

如果任何分数小于50,则使学生失败

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

结果: true

说明:

  • $carry的默认值为false

  • 如果任何分数小于50,则返回true;否则,返回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,因此我们在条件条件中进行检查。