在Laravel、Blade或PHP中按键将每个数组child项的总量相加

Adding up the total amount of each array child item by key in Laravel, Blade or PHP

我正在尝试将每个 receiptitems->value 每个 receipt/parent 的总金额加起来。

理想的结果是循环显示收据;

receipt->id 
receipt->merchant
receipt->totalValue

每个 child 值的总值(即整个收据值)。

示例 JSON 输出:

[  
   {  
      "id":1,
      "user_id":1,
      "image":"58a31ba406d16.jpg",
      "merchant":"Tesco",
      "created_at":"2016-04-23 22:02:58",
      "receiptitems":[  
         {  
            "receipt_id":1,
            "category_id":2,
            "value":5285
         },
         {  
            "receipt_id":1,
            "category_id":5,
            "value":5231
         },
         {  
            "receipt_id":1,
            "category_id":5,
            "value":6822
         }
      ]
   },
   {  
      "id":2,
      "user_id":1,
      "image":"58a31ba4073c8.jpg",
      "merchant":"Tesco",
      "created_at":"2016-09-19 02:55:38",
      "receiptitems":[  
         {  
            "receipt_id":2,
            "category_id":2,
            "value":7009
         },
         {  
            "receipt_id":2,
            "category_id":7,
            "value":2147
         }
      ]
   },
   {  
      "id":3,
      "user_id":1,
      "image":"58a31ba407a26.jpg",
      "merchant":"Tesco",
      "created_at":"2016-08-06 12:30:27",
      "receiptitems":[  
         {  
            "receipt_id":3,
            "category_id":7,
            "value":4598
         },
         {  
            "receipt_id":3,
            "category_id":2,
            "value":8799
         },
         {  
            "receipt_id":3,
            "category_id":3,
            "value":773
         }
      ]
   },
   {  
      "id":4,
      "user_id":1,
      "image":"58a31ba407e69.jpg",
      "merchant":"Tesco",
      "created_at":"2016-12-10 21:21:43",
      "receiptitems":[  
         {  
            "receipt_id":4,
            "category_id":5,
            "value":883
         },
         {  
            "receipt_id":4,
            "category_id":5,
            "value":3013
         },
         {  
            "receipt_id":4,
            "category_id":2,
            "value":1013
         },
         {  
            "receipt_id":4,
            "category_id":1,
            "value":3243
         }
      ]
   },
   {  
      "id":5,
      "user_id":1,
      "image":"58a31ba408187.jpg",
      "merchant":"Tesco",
      "created_at":"2017-01-18 14:12:16",
      "receiptitems":[  
         {  
            "receipt_id":5,
            "category_id":7,
            "value":1355
         },
         {  
            "receipt_id":5,
            "category_id":1,
            "value":1547
         },
         {  
            "receipt_id":5,
            "category_id":1,
            "value":1640
         },
         {  
            "receipt_id":5,
            "category_id":1,
            "value":2466
         },
         {  
            "receipt_id":5,
            "category_id":8,
            "value":2689
         }
      ]
   }
]

我一直在控制器和 blade 模板中尝试,但无法获得所需的结果。我一直在看 array_sum() http://php.net/manual/en/function.array-sum.php 但我不确定如何实现它。

我在 RecriptsController 中尝试过:

$receipts = Receipt::where('user_id', Auth::id())
    ->with('receiptitems')
    ->get();

foreach ($receipts as $receipt) {
    $result = array_sum($receipt->receiptitems->value);
};

return $result;

并且也在 Blade 模板中:

@foreach($receipts as $receipt)
    <li>{{ $receipt->merchant }}</li>
    <ul>
    @foreach($receipt->receiptitems as $item)
        <li>{{ array_sum($item->value) }}</li>
    @endforeach
    </ul>
@endforeach

一般来说,你想要array_column in combination with array_sum:

foreach ($receipts as $receipt) {
    $total = array_sum(array_column($receipt['receiptitems'], 'value'));
    print_r($total);
}

array_columnreceiptitems sub-array 中取出 value 键。然后 array_sum 合计。但是你有一个对象集合,所以你实际上需要一种基于 array_map:

的稍微不同的方法
foreach ($receipts as $receipt) {
    $total = array_sum(array_map(function ($o) { return $o->value; }, $receipt->receiptitems));
    print_r($total);
}

顺便说一句,您可能需要考虑一个 Receipt::getTotalAttribute() 增变器,它将 return 项目总数并简化您与模型的交互方式。

虽然问题得到了回答,但我得到了我想要的结果。一位朋友帮助我选择了另一个选项(集合),该选项也有效:

public function index()
{
    $receipts = Receipt::where('user_id', Auth::id())
        ->with('receiptitems')
        ->get();

    $collection = collect($receipts);
    $data = $collection->map(
        function($receipt) {
            $r = new stdClass;
            $r->id = $receipt->id;
            $r->merchant = $receipt->merchant;
            $r->amount = collect($receipt->receiptitems)->pluck('value')->sum();
            $r->date = $receipt->date;
            return $r;
        }
    );

    return view('transactions', compact('data'));
}

希望对其他人有所帮助。