【问题标题】:How to match Array Key name with another Array Key name如何将 Array Key 名称与另一个 Array Key 名称匹配
【发布时间】:2019-09-09 10:38:31
【问题描述】:

我有 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
]

输出 $director

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 实现这一点。您能解释一下您的疑问以及您想要做什么吗?
  • @vivek_23 ,谢谢,是的,这就是我的想法,使用 SQL 查询可能有一种简单的方法,我使用的是 Laravel,基本上,我有 2 个表,director_name(id,name) , Receipts (id,exp_earn_type,amount,diretor_id) , 我正在尝试实现, 哪个导演的费用是多少, Currenlty 我可以得到这个作为导演ID和金额, 只需要通过导演姓名和金额进行映射。

标签: php arrays laravel-5.2 laravel-blade


【解决方案1】:

你需要遍历directors数组,然后在循环的路上,你可以在director_id的帮助下通过握手来遇到$investor_total_by_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 — 创建包含变量及其值的数组

【讨论】:

  • 谢谢我正在写入控制器,然后我需要从控制器将值传递给刀片,在控制器中,我将如何从 director 数组(来自表)和investor_total_by_id 数组映射 id `$ director_id_name_map=[]; foreach ($director as $key => $value) { // 我如何从 director 数组中映射 id 和 id 和 $investor_total_by_id ? } `
  • @alammd 检查我的 EDIT 2 部分答案。
  • 请查看上述问题中$director 的内容,只是指出,我使用的是来自数据库的变量$director,而不是$directors[]。 (错误命名变量的应用程序)所以当我使用你的代码时,它会说,“未定义的偏移量:2”
  • 哦,好的,修改了edit 2部分的完整代码,刷新此页面再检查一次。
  • $director_id_name_map[$value] = $investor_total_by_id[$key]; 立即查看
【解决方案2】:

好的,根据您的 cmets,我正在考虑将其作为您的数据库表。

director_name(id,name)

收据(id,exp_earn_type,amount,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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 2021-12-08
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多