如何将Array Key名称与另一个Array Key名称匹配

问题描述 投票:5回答:2

我有2个Array,两个Array共同的是Director_id来匹配

我试图用另一个数组的值映射一个数组的键。

$invest_details = DB::table('directors_invest')
    ->join('directors', 'directors.id', '=', 'directors_invest.director_id')
    ->select('directors_invest.*', 'directors.name as directors_name')
    ->get();
##

$expense_details = DB::table('receipts')
    ->join('directors', 'directors.id', '=', 'receipts.director_id')
    ->join('account_type', 'account_type.id', '=', 'receipts.type')
    ->join('expense_type', 'expense_type.id', '=', 'receipts.exp_earn_type')

    ->select('receipts.*', 'directors.name as directors_name', 'account_type.name as account_name', 'expense_type.name as exp_name')
    ->get();

//dd($expense_details);

$director  = DB::table('directors')->get();
$directors = [];
foreach ($director as $value) {
    $directors[$value->id] = $value->name;
}

// Here I will map Director_id and total invest
$investor_total_by_id = [];

foreach ($expense_details as $exp) {
    if (isset($investor_total_by_id[$exp->director_id])) {
        $investor_total_by_id[$exp->director_id] += $exp->amount;

    } else {
        $investor_total_by_id[$exp->director_id] = $exp->amount;

    }
}

dd($investor_total_by_id);
//this gives me out put
//
//      array:2 [▼
//  1 => 7100.0
//  2 => 444.0
//        ]

//** Match Convert Director_id to Director Name. so it will be
//     Director1 => 7100
//     Director2 => 440

$director_id_name_map = [];

foreach ($director as $value) {
    foreach ($investor_total_by_id as $key => $id_value) {

        if (key($investor_total_by_id) == $director[$value->id]) {

            $director_id_name_map[$directors->name] = $investor_total_by_id[$id_value->amount];

        }

    }
}

//dd($investor_total_by_id);
dd($$director_id_name_map);

return view('Accounts/Investment/add')
    ->with('invest_details', $invest_details)
    ->with('expense_details', $expense_details)
    ->with('directors', $directors)
    ->with('investor_total_by_id', $investor_total_by_id)

;
}

看到2 Array的输出

$ investor_total_by_id的输出

array:2 [▼
  1 => 7100.0
  2 => 444.0
]

输出$导演

Collection {#531 ▼
  #items: array:2 [▼
    0 => {#533 ▼
      +"id": 1
      +"name": "Directror1"
      +"phone": ""
      +"email": ""
      +"address": "hi"
      +"created_at": "2019-04-18 13:10:04"
      +"updated_at": "2019-04-18 07:10:04"
    }
    1 => {#534 ▼
      +"id": 2
      +"name": "Director2"
      +"phone": ""
      +"email": ""
      +"address": "hi"
      +"created_at": "2019-04-18 14:35:56"
      +"updated_at": "2019-04-18 07:10:04"
    }
  ]
}

我希望在Blade中创建一个表格

Director1 7100
Direcot2  440

表格如下

<table border=1>
    <th> Director Name </th>
    <th> Amount</th>
    <td> Director1 <td>
    <td>
    <td> 7100 </td>
    <td> Director2 <td>
    <td>
    <td> 440 </td>
<table>
php arrays laravel-5.2 laravel-blade
2个回答
2
投票

好的,基于您的评论,我在下面考虑您的数据库表。

director_name(ID,姓名)

收据(ID,exp_earn_type,量,DIRECTOR_ID)

  • 所以,首先我们内部加入两个表,并使用sum()获得每个导演的总费用。
  • 然后我们用director_name表加入前一个子查询,以获取导演名称及其他细节。

码:

<?php

    $director_expenses = DB::table('receipts')
                         ->join('director_name','receipts.director_id','=','director_name.id')
                         ->select('receipts.director_id', DB::raw('sum(receipts.amount) as total_expense'))
                         ->groupBy('receipts.director_id');

    $director_details = DB::table('director_name')
                        ->joinSub($director_expenses, 'director_expenses', function ($join) {
                            $join->on('director_name.id', '=', 'director_expenses.director_id');
                        })
                        ->select('director_name.id','director_name.name','director_expenses.total_expense')
                        ->get();

    dd($director_details);

1
投票

你需要遍历director数组,然后在循环的方式,你可以通过在$investor_total_by_id的帮助下进行握手,然后从下面提取数据来满足director_id

<table border="1">
    <tr>
        <th>Director Name</th>
        <th>Amount</th>
    </tr>
    @foreach ($directors as $key => $value)
        <tr>
            <td>{{ $value->name }}</td>
            <td>{{ $investor_total_by_id[$value->id] }}</td>
        </tr>
    @endforeach
</table>

编辑

return view('foldername.viewname', compact('directors', 'investor_total_by_id'));

您可以调用上面的视图以及压缩两个数组。

编辑2

$director_id_name_map = [];
foreach ($directors as $key => $value) {
    $director_id_name_map[$value] = $investor_total_by_id[$key];
}

通过以上代码,您可以在控制器中映射您的期望。

compact - 创建包含变量及其值的数组

© www.soinside.com 2019 - 2024. All rights reserved.