使用 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,因此我們在條件中檢查它。