2017-10-24 6 views
1

ich eine Laravel Sammlung auf Ausgang haben analysieren, ich will es analysieren -> toArray()Wie eine Laravel Sammlung

Collection {#335 
    #items: array:2 [ 
    "0f39b1e0-a507-11e7-9d6e-33e84951047e" => array:2 [ 
     "total_amount" => 25000 
     "debt_type" => array:2 [ 
     0 => "car_loan" 
     1 => "car_loan" 
     ] 
    ] 
    "0f218520-a507-11e7-b0ba-8554a4ad039b" => array:2 [ 
     "total_amount" => 15000 
     "debt_type" => array:1 [ 
     0 => "house_loan" 
     ] 
    ] 
    ] 
} 

ist es eine Möglichkeit, es zu analysieren, damit ich die folgende Ausgabe:

array:1[ 
     0=>[ 
     'debt_id'=>'0f39b1e0-a507-11e7-9d6e-33e84951047e', 
     'debt_type'=>'car_loan', 
     'total_amount'=>25000 
     ], 
     1=>[ 
     'debt_id'=>'0f218520-a507-11e7-b0ba-8554a4ad039b', 
     'debt_type'=>'house_loan', 
     'total_amount'=>15000 
     ] 
] 

, was ich habe versucht, es funktioniert, aber nicht sicher, ob es ein guter Weg, um es zu gehen:

$appDebts = $appDebts->groupBy('debt_type_id')->map(function ($item) { 
    return [ 

     'total_amount' => $item->sum('amount'), 
     'debt_type' => $item->map(function ($item) { 
      return $item->debt_type->slug; 
     })->toArray(), 
    ]; 
})->toArray(); 

wenn Sie $ appDebts dd Sie die collect erhalten Ion, das ich auf dem Posten

$carLoan  = []; 
$studentLoan = []; 
$houseLoan = []; 
$cardLoan = []; 

foreach ($appDebts as $debt) { 

    if ($debt['debt_type'][0] === 'car_loan') { 
     $carLoan['TotalAmount'] = $debt['total_amount']; 
     $carLoan['LoanType'] = $debt['debt_type'][0]; 

    } 
    if ($debt['debt_type'][0] === 'house_loan') { 

     $houseLoan['TotalAmount'] = $debt['total_amount']; 
     $houseLoan['LoanType'] = $debt['debt_type'][0]; 
    } 
    if ($debt['debt_type'][0] === 'student_loan') { 

     $studentLoan['TotalAmount'] = $debt['total_amount']; 
     $studentLoan['LoanType'] = $debt['debt_type'][0]; 
    } 
    if ($debt['debt_type'][0] === 'credit_card_loan') { 

     $cardLoan['TotalAmount'] = $debt['total_amount']; 
     $cardLoan['LoanType'] = $debt['debt_type'][0]; 
    } 

} 
+1

siehe [toArray()] (https://laravel.com/docs/5.5/collections#method-toarray) –

+1

Iterieren Sie durch die Sammlung und erstellen Sie Ihr eigenes Array, seit der Struktur Sie wollen nicht übereinstimmen die Struktur der Sammlung. – aynber

+0

@JigarShah ich kenne diese Funktion bereits, deshalb habe ich auf meine Frage hingewiesen, aber das Problem ist wie? –

Antwort

0

mit dieser Zuordnung nach dem ersten Versuchen, die Sie haben hinzugefügt:

$appDebts = $appDebts->groupBy('debt_type_id')->map(function ($item) { 
    return [ 

     'total_amount' => $item->sum('amount'), 
     'debt_type' => $item->map(function ($item) { 
      return $item->debt_type->slug; 
     })->toArray(), 
    ]; 
}); // <-- remove ->toArray() from here 

$appDebts = $appDebts->map(function ($item, $key) { 
    return [ 
     'debt_type_id' => $key 
     'debt_type' => $item["debt_type"][0], // assuming you want the first type !! 
     'total_amount' => $item["total_amount"], 
    ]; 
})->toArray(); 

PS: für mehr Leistung Dieser konvertiert die angegebene Sammlung tha Fahndungs ​​Array Zwicken betrachtet die Abfrage der SQL-Bearbeitung oder die Logik des appDebts bekommen

+0

@Trace_le funktioniert es gut? – Maraboc

+0

ja danke für deine zeit –

2

Basierend auf dem Array Sie geteilt:

$parsed = $collection->map(function ($item, $id) { 
    return [ 
     'debt_id' => $id, 
     'debt_type' => collect($item['debt_type'])->first(), 
     'total_amount' => $item['total_amount'] 
    ]; 
})->values()->toArray(); 

Mit values entfernen Sie die key => value, erhalten Sie das Array ohne Schlüssel

0

Das einzige, was ich zu @ Llopele hinzufügen Antwort der ist keyBy() zur einfacheren Datenzugriff zu verwenden:

$parsed = $collection->map(function ($item, $id) { 
    return [ 
     'debt_id' => $id, 
     'debt_type' => collect($item['debt_type'])->first(), 
     'total_amount' => $item['total_amount'] 
    ]; 
})->values()->keyBy('debt_type')->toArray(); 

So, jetzt können Sie Zugriffsdaten wie folgt Arr::get($parsed, 'house_loan');