Utilizo esta técnica para agrupar la matriz de correcciones de errores por fecha en el panel del Inspector, y pensé que podría ser una buena idea de fragmento de código para otros. También escribí una implementación para plantillas blade de Laravel y una implementación más detallada que admite el filtrado.
Decidí implementar este código porque hace que sea muy fácil desplazarse por una lista de elementos según su historial.
Esta implementación utiliza la función array_reduce. Permite crear progresivamente un nuevo array donde cada fecha se convierte en una clave, con el elemento correspondiente como valor.
$data = [ ['date' => '2023-06-01', 'value' => 10], ['date' => '2023-06-02', 'value' => 20], ['date' => '2023-06-01', 'value' => 30], ['date' => '2023-06-03', 'value' => 40], ['date' => '2023-06-02', 'value' => 50], ]; $groupedData = array_reduce($data, function ($result, $item) { $date = new DateTime($item['date']); $formattedDate = $date->format('Y-m-d'); if (!isset($result[$formattedDate])) { $result[$formattedDate] = []; } $result[$formattedDate][] = $item; return $result; }, []); //Gracias al objeto DateTime y el método de formato puedes personalizar la lógica de agrupación por mes o año, simplemente cambiando la cadena de formato: 'Y-m' para mes, o 'Y' para año.
Filtrar y agrupar
También puedes introducir una función de filtro para filtrar los elementos antes de agruparlos por el campo de fecha.
$groupedData = array_reduce(array_filter($data, function ($item) use ($filter) { // Filter condition: keep elements with value greater than 20 return $item['value'] > $filter; }), function ($result, $item) { $date = new DateTime($item['date']); $formattedDate = $date->format('Y-m-d'); if (!isset($result[$formattedDate])) { $result[$formattedDate] = []; } $result[$formattedDate][] = $item; return $result; }, []);Dentro de la función de devolución de llamada de array_filter(), especificamos la condición del filtro. En este ejemplo, mantenemos solo los elementos donde el campo "valor" es mayor que $filtro. Puede modificar esta condición según su caso de uso específico.
Mostrando resultados en la interfaz de usuario con la hoja Laravel
Obviamente puedes inspirarte y utilizar la misma estrategia en tu tecnología específica (como Symfony Twig o similar).
Para mantener las declaraciones de manipulación de datos separadas de la vista, mantengo el proceso de filtrado y agrupación en el nivel del controlador, e implemento solo la iteración de la estructura de datos en el lado de la plantilla.
Aquí está el controlador:
namespace App\Http; use Illuminate\Http\Request; class DashboardController extends Controller { /** * The dashboard. * * @param ImpersonatesUsers $impersonator * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ public function index(Request $request) { $data = $this->getData(); $data = array_reduce(array_filter($data, function ($item) use ($filter) { // Filter condition: keep elements with value greater than 20 return $item['value'] > $filter; }), function ($result, $item) { $date = new DateTime($item['date']); $formattedDate = $date->format('Y-m-d'); if (!isset($result[$formattedDate])) { $result[$formattedDate] = []; } $result[$formattedDate][] = $item; return $result; }, []); return view('dashboard', compact('data')); } }Y aquí está la vista de la hoja:
Gracias a las utilidades integradas proporcionadas por la clase Laravel Collection, es realmente sencillo:
$groupedData = collect($data)->groupBy(function ($item) { return Carbon::parse($item->date)->format('Y-m-d'); });
Puedes seguirme en Linkedin o X. Publico sobre cómo desarrollar mi negocio SaaS.
Inspector es una herramienta de monitoreo de ejecución de código diseñada específicamente para desarrolladores de software. No necesita instalar nada a nivel de servidor, simplemente instale el paquete de compositor y estará listo para comenzar.
Inspector es súper fácil y compatible con PHP. Puedes probar nuestro paquete Laravel o Symfony.
Si busca monitoreo HTTP, información sobre consultas de bases de datos y la capacidad de reenviar alertas y notificaciones a su entorno de mensajería preferido, pruebe Inspector de forma gratuita. Registre su cuenta.
O obtenga más información en el sitio web: https://inspector.dev
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3