"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Cómo agrupar una matriz por fecha en PHP – Consejos rápidos

Cómo agrupar una matriz por fecha en PHP – Consejos rápidos

Publicado el 2024-11-03
Navegar:807

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.

Agrupar matriz por fecha en PHP puro

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:

    @foreach ($groupedData as $date => $items)
  • {{ $date }}
      @foreach ($items as $item)
    • Value: {{ $item['value'] }}
    • @endforeach
  • @endforeach

Agrupar una colección Laravel por fecha

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.

Monitoriza tu aplicación PHP gratis

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

How to group array by date in PHP – Fast Tips

Declaración de liberación Este artículo se reproduce en: https://dev.to/inspector/how-to-group-array-by-date-in-php-fast-tips-4oc0?1 Si hay alguna infracción, comuníquese con Study_golang@163 .com para eliminarlo
Último tutorial Más>

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