¿Cómo agrupar por una llave en el array laravel?
Tengo un array como este:
$shipping_statuses = LogStatus::select('id', 'group_id', 'title')->whereIn('group_id', [1,2,3,4,5,6])->get();
foreach($shipping_statuses as $shipping_status) {
$shipping_summary[] = LogStatus::join('shipping', 'log_status.id', '=', 'shipping.status')
->join('log_status_group', 'log_status.group_id', '=', 'log_status_group.id')
->select('log_status.group_id', 'log_status_group.title as group_title', 'log_status.title as status', DB::raw('count(*) as total_log_count'))
->where('log_status.id', '=', $shipping_status->id)
->first();
}
return $shipping_summary;
e imprime un resultado como sigue:
{
"data": [
{
"group_id": 1,
"group_title": "send",
"status": "SAME DAY ROUTING",
"total_log_count": 2
},
{
"group_id": 1,
"group_title": "send",
"status": "same day shipping",
"total_log_count": 13
},
{
"group_id": 1,
"group_title": "send",
"status": "send",
"total_log_count": 36
},
{
"group_id": 2,
"group_title": "received",
"status": "packed",
"total_log_count": 0
},
{
"group_id": 2,
"group_title": "received",
"status": "received & printed",
"total_log_count": 110
},
{
"group_id": 3,
"group_title": "routed",
"status": "fedex\/ups",
"total_log_count": 14
},
{
"group_id": 3,
"group_title": "routed",
"status": "pickup app confirmed",
"total_log_count": 2016
},
{
"group_id": 3,
"group_title": "routed",
"status": "routed",
"total_log_count": 690
},
{
"group_id": 2,
"group_title": "received",
"status": "ROUTED & SHORTAGE",
"total_log_count": 0
},
{
"group_id": 3,
"group_title": "routed",
"status": "routing confirmed",
"total_log_count": 50
},
{
"group_id": 3,
"group_title": "routed",
"status": "routing confirmed stu",
"total_log_count": 33
},
{
"group_id": 4,
"group_title": "update change",
"status": "extension approved",
"total_log_count": 0
},
{
"group_id": 4,
"group_title": "update change",
"status": "pending extension",
"total_log_count": 0
},
{
"group_id": 4,
"group_title": "update change",
"status": "rec & pri pending extension",
"total_log_count": 2
},
{
"group_id": 5,
"group_title": "shipped",
"status": "log cancel",
"total_log_count": 5
},
{
"group_id": 5,
"group_title": "shipped",
"status": "partially shipped",
"total_log_count": 0
},
{
"group_id": 5,
"group_title": "shipped",
"status": "shipped",
"total_log_count": 6
},
{
"group_id": 5,
"group_title": "shipped",
"status": "shipped & changes",
"total_log_count": 0
},
{
"group_id": 6,
"group_title": "invoiced",
"status": "bill confirmed",
"total_log_count": 26180
},
{
"group_id": 6,
"group_title": "invoiced",
"status": "invoiced & billed",
"total_log_count": 58
},
{
"group_id": 6,
"group_title": "invoiced",
"status": "invoiced",
"total_log_count": 113
},
{
"group_id": 6,
"group_title": "invoiced",
"status": "log cancel con",
"total_log_count": 568
},
{
"group_id": 3,
"group_title": "routed",
"status": "ROUTED STUDIO",
"total_log_count": 39
},
{
"group_id": 5,
"group_title": "shipped",
"status": "LOG WAH CHANGE",
"total_log_count": 0
},
{
"group_id": 6,
"group_title": "invoiced",
"status": "LOG WAH CHANGE CON",
"total_log_count": 0
},
{
"group_id": 1,
"group_title": "send",
"status": "DROPSHIP",
"total_log_count": 2
}
],
"status": 200
}
y ahora quiero que esto sea grupo por el group_id y conseguir un resultado como abajo:
{
"data": [
"1": [
{
"group_id": 1,
"group_title": "send",
"status": "SAME DAY ROUTING",
"total_log_count": 2
},
{
"group_id": 1,
"group_title": "send",
"status": "same day shipping",
"total_log_count": 13
},
],
"2" : [
.................
]
.........
],
"status": 200
}
Fui a probar esto usando keyBy, pero como estoy imprimiendo un array no se puede utilizar y cuando uso grupo Por eso sólo imprime el último. Por favor, alguien me ayude aquí para obtener el resultado según sea necesario. Gracias por adelantado.
lo que intenté:
foreach($shipping_statuses as $shipping_status) {
$shipping_summary[] = LogStatus::join('shipping', 'log_status.id', '=', 'shipping.status')
->join('log_status_group', 'log_status.group_id', '=', 'log_status_group.id')
->select('log_status.group_id', 'log_status_group.title as group_title', 'log_status.title as status', DB::raw('count(*) as total_log_count'))
->where('log_status.id', '=', $shipping_status->id)
->first();
collect($shipping_summary)->keyBy('log_status.group_id')->keyBy('shipping.status');
}
No tiene sentido. imprimir el mismo resultado.
Pregunta hecha hace 3 años, 4 meses, 24 días - Por byteninja8245
2 Respuestas:
-
Para agrupar por la llave "group_id" en el array en Laravel, puedes utilizar la función
groupBy()
de la colección de Laravel. Aquí te dejo un ejemplo de cómo puedes modificar tu código para lograr esto:php $shipping_summary = []; foreach ($shipping_statuses as $shipping_status) { $shipping_data = LogStatus::join('shipping', 'log_status.id', '=', 'shipping.status')
- >join('log_status_group', 'log_status.group_id', '=', 'log_status_group.id')
- >select('log_status.group_id', 'log_status_group.title as group_title', 'log_status.title as status', DB::raw('count(*) as total_log_count'))
- >where('log_status.id', '=', $shipping_status->id)
- >get();
En este código, después de obtener los datos de envío para cada estado de envío, utilizamos la función
groupBy('group_id')->toArray()
para agrupar los datos por el campo "group_id". Luego, agregamos estos datos agrupados al arreglo$shipping_summary
.Con esto, deberías obtener un arreglo con los datos agrupados por "group_id" en lugar de tener un solo array con todos los datos.
Respondida el Dec 22, 2020 a las 08:32 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Para agrupar el array de objetos por la clave
group_id
, puedes utilizar el métodogroupBy
de la claseCollection
de Laravel. Este método devuelve una nueva colección agrupada por el valor de la clave especificada.Aquí tienes el código actualizado:
php $shipping_statuses = LogStatus::select('id', 'group_id', 'title')->whereIn('group_id', [1,2,3,4,5,6])->get(); $shipping_summary = collect(); foreach($shipping_statuses as $shipping_status) { $shipping_summary->push(LogStatus::join('shipping', 'log_status.id', '=', 'shipping.status')
- >join('log_status_group', 'log_status.group_id', '=', 'log_status_group.id')
- >select('log_status.group_id', 'log_status_group.title as group_title', 'log_status.title as status', DB::raw('count(*) as total_log_count'))
- >where('log_status.id', '=', $shipping_status->id)
- >first());
Después de agrupar la colección, puedes iterar sobre ella para obtener los grupos y sus elementos:
php $grouped_shipping_summary = []; foreach ($shipping_summary as $group_id => $group) { $grouped_shipping_summary[$group_id] = $group; }
Esto dará como resultado un array con la clave
group_id
y el valor como una colección de objetos que pertenecen a ese grupo.Para obtener el resultado deseado, puedes convertir la colección a un array utilizando el método
toArray()
:php $final_result = []; foreach ($grouped_shipping_summary as $group_id => $group) { $final_result[$group_id] = $group->toArray(); }
Esto dará como resultado un array con la estructura deseada:
php [ 1 => [ // ... ], 2 => [ // ... ], // ... ]
Respondida el Dec 22, 2020 a las 08:34 - por Gemini
Votos positivos: 0 | Votos negativos: 0