如何在Laravel Controller中获得每次lop的总金额



我想从控制器中的每个lop数据中获得总金额,例如,下面的代码。


$set = settings::findOrFail(1);
$api = new BinanceAPI("$set->api_key","$set->scrt_key");
$api->useServerTime();
$forusdvaluetotal = coins::whereuser_id(Auth::user()->id)->get();
foreach($forusdvaluetotal as $coins){
$getsymbol = $coins->symbol.'USDT';
$getprice = $api->price("$getsymbol");
$valueinusd = $coins->balance*$getprice;
$total = $valueinusd;    
}
$gettotal = $total->sum();

like "coins "价格为每枚50美元,余额为2,"硬币"价格为每枚50美元,余额为5美元,"硬币"为"硬币"。价格为每枚硬币50美元,余额为1。所以我想通过余额得到美元的总金额,如('硬币A' $502 = $100 + '硬币B' $505 = $250 + '硬币A' $50*1 = $50) = $400

请帮助我如何解决laravel控制器

试试这个:

$total = 0;
foreach($forusdvaluetotal as $coins){
$getprice = $coins['market_price'];
$valueinusd = $coins['balance']*$getprice;
$total += $valueinusd;    
}
return $total;

一个优雅的选择是使用Laravel的支持收集方法reduce()

reduce方法将集合减少为单个值,通过将每次迭代的结果放入后续迭代中:

第一次迭代$carry的值为null;然而,你可以通过传递第二个参数来指定它的初始值reduce:


$collection = coins::whereuser_id(Auth::user()->id)->get();
$total = $collection->reduce(function ($carry, $item) {
return $carry + (floatval($item->balance) * floatval($item->market_price));
}, 0);

附录

或者,你可以使用Laravel的支持收集方法sum()

sum方法返回集合中所有项的和:

此外,您可以传递自己的闭包来确定哪些值要求和的集合:


$collection = coins::whereuser_id(Auth::user()->id)->get();
$total = $collection->sum(function ($item) {
return (floatval($item->balance) * floatval($item->market_price));
});

编辑:

针对你的新问题的变化,你可以这样解决。

$set = settings::findOrFail(1);
$api = new BinanceAPI("$set->api_key","$set->scrt_key");
$api->useServerTime();
$query = coins::whereuser_id(Auth::user()->id);
// Get symbols.
$symbols = (clone $query)->distinct('symbol')->pluck('symbol')->flip()->toArray();
// Fetch prices.
array_walk($symbols, function (&$value, $key) use ($api) {
$value = $api->price("{$key}USDT");
});
// Get total sum.
$total = $query->get()->reduce(function ($carry, $item) use ($symbols) {
return $carry + (floatval($item->balance) * floatval($symbols[$item->symbol]));
}, 0);

最新更新