根据ID从$bank_totals数组中筛选对应银行的amount值
从银行总额数组中筛选指定ID对应的金额值
我需要从$bank_totals数组中筛选出指定ID对应的amount值。$bank_totals由TransactionsRepository类的bank_balances()方法生成,该方法会遍历所有银行、计算各银行收支总额后,返回包含id、bank、amount的数组。我通过$data['id']获取用户输入的ID,比如当$data['id']=2时,希望得到对应金额25000.0,需要实现这个筛选逻辑。
现有调用代码
$bank_totals = $bank_totals->bank_balances();
数组示例
[ [ "id" => 1, "bank" => "KCB", "amount" => 7622.0 ], [ "id" => 2, "bank" => "I & M Bank", "amount" => 25000.0 ] ]
bank_balances()方法代码
class TransactionsRepository { public function bank_balances(){ $banks_data = Bank::all(); $banks_totals = []; foreach ($banks_data as $bank){ $totals = (BankingTransactions::where('bank_id', $bank->id)->sum('amount')) - ((PettyCash::where('bank_id', $bank->id)->sum('amount')) + (PayDoctor::where('bank_id', $bank->id) ->sum('total_paid'))); array_push($banks_totals, [ 'id'=>$bank->id, 'bank'=>$bank->name, 'amount'=>$totals, ]); } return $banks_totals; } }
解决方案
方案1:基于已有数组筛选
如果已经获取了完整的$bank_totals数组,可通过以下方式筛选指定ID的金额:
方式A:foreach循环(高效直观)
$targetId = $data['id']; $targetAmount = 0.0; // 默认值,防止找不到对应ID时出错 foreach ($bank_totals as $item) { if ($item['id'] == $targetId) { $targetAmount = $item['amount']; break; // 找到目标后立即终止循环 } } // 输出结果 echo $targetAmount;
方式B:array_filter简化代码
$targetId = $data['id']; $filteredItems = array_filter($bank_totals, function($item) use ($targetId) { return $item['id'] == $targetId; }); // 取筛选结果的第一个金额,无匹配时返回0.0 $targetAmount = !empty($filteredItems) ? reset($filteredItems)['amount'] : 0.0;
方案2:优化原方法,减少不必要查询
如果仅需单个ID的金额,没必要查询所有银行数据,可修改bank_balances()方法添加可选参数,直接查询目标银行:
class TransactionsRepository { // 添加$bankId可选参数,默认null表示查询全部银行 public function bank_balances($bankId = null){ // 根据参数查询对应银行 $banksData = is_null($bankId) ? Bank::all() : Bank::where('id', $bankId)->get(); $banksTotals = []; foreach ($banksData as $bank){ $totals = (BankingTransactions::where('bank_id', $bank->id)->sum('amount')) - ((PettyCash::where('bank_id', $bank->id)->sum('amount')) + (PayDoctor::where('bank_id', $bank->id) ->sum('total_paid'))); $banksTotals[] = [ 'id'=>$bank->id, 'bank'=>$bank->name, 'amount'=>$totals, ]; } // 指定ID时直接返回金额,否则返回完整数组 return is_null($bankId) ? $banksTotals : (!empty($banksTotals) ? $banksTotals[0]['amount'] : 0.0); } }
调用方式:
// 直接获取指定ID的金额 $targetAmount = $bank_totals->bank_balances($data['id']); echo $targetAmount;
内容的提问来源于stack exchange,提问作者kennie
相关产品推荐
相关产品推荐

