Как управлять объектами данных и массивами с помощью функции карты Laravel?

#php #arrays #laravel #object #highcharts

Вопрос:

Код:

 $loans = Loan::select('date_release')
               ->where('invalid',false)
               ->where('transaction_year', $transyear)
               ->get()
               ->groupBy(function($date) {
        
           return Carbon::parse($date->date_release)->format('m'); // grouping by months
    });

    $loanmcount = [];
    $loanArr = [];

    foreach ($loans as $key => $value) {
        $loanmcount[(int)$key] = count($value);
    }

    for($i = 1; $i <= 12; $i  ){
        if(!empty($loanmcount[$i])){
            $loanArr[$i] = $loanmcount[$i];    
        }else{
            $loanArr[$i] = 0;    
        }
    }

$loanTypeCount = Loan::select(['loan_type AS name', DB::raw('count(loan_type) AS y')])
                     ->groupBy('loan_type')
                     ->orderBy(DB::raw('y'), 'desc')
                     ->where('transaction_year', $transyear)
                     ->where('invalid', false)
                     ->get(); 

$loanTypeCount->map(function($loan)use($loanArr) {    
    $loan->data = $loanArr;
    return $loan;
})
 

Выход:

 var_dump(json_encode($loanTypeCount));
 

string(433) "[{"name":"Salary","y":"6","data":{"1":0,"2":0,"3":0,"4":0,"5":2,"6":1,"7":3,"8":1,"9":1,"10":0,"11":0,"12":0}},{"name":"Emergency","y":"1","data":{"1":0,"2":0,"3":0,"4":0,"5":2,"6":1,"7":3,"8":1,"9":1,"10":0,"11":0,"12":0}}]"

Месяцы были представлены числами вместо названия месяца. Кроме того, формат не в виде массива, как показано ниже.

Желаемый Результат:

   [
        {
            name: "Salary",
            y: "1",
            data: [
                [
                    "January",
                    0.1
                ],
                [
                    "February",
                    1.3
                ],
                
            ]
        },
        {
            name: "Emergency",
            y: "2",
            data: [
                [
                    "March",
                    0.1
                ],
                [
                    "April",
                    1.3
                ],
                
            ]
        }
  ]
 

Каково решение для этого? Не могу этого понять. Пожалуйста, помогите. Спасибо.

Ответ №1:

в PHP функция имеет закрытую область ,поэтому вы не можете получить доступ к переменной обычно внутри функции.вы должны вручную передать его в функцию try:

 $loanTypeCount->map(function ($loan) use ($loanArr) {    
        $loan->data = $loanArr;
        return $loan;
    });
 

Комментарии:

1. Я отредактировал свой вопрос, чтобы было ясно, ошибка исчезла, но формат данных не соответствует желаемому результату.

2. Я отредактировал решение ,вам нужен ответ в виде массива, но вы делаете его ассоциативным массивом, который является объектом в формате json, а не массивом

3. В этой строке написано Неопределенное смещение: 1: array_push($loanArr,массив($loanArr[$i],0));

4. извините за это ,не могли бы вы показать мне, как $loanmcount выглядит

5. массив(5) { [9]=> int(1) [5]=>> int(2) [6]=>>> инт(1) [7]=>>>> инт(3) [8]=>>>>> int(1) }