Как сопоставить имя ключа массива с другим именем ключа массива - PullRequest
4 голосов
/ 19 апреля 2019

У меня есть 2 массива, оба массива имеют значение 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>

Ответы [ 2 ]

2 голосов
/ 19 апреля 2019

Хорошо, поэтому, основываясь на ваших комментариях, я рассматриваю ниже в качестве таблиц вашей БД.

имя_директора (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 голос
/ 19 апреля 2019

Вам необходимо пройти через массив директоров, а затем по пути зацикливания вы можете встретить $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 - Создать массив, содержащий переменные и их значения

...