"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como agrupar array por data em PHP – Dicas rápidas

Como agrupar array por data em PHP – Dicas rápidas

Publicado em 2024-11-03
Navegar:878

Eu uso essa técnica para agrupar a matriz de correções de bugs por data no painel do Inspetor e achei que poderia ser uma boa ideia de trecho de código para outros. Também escrevi uma implementação para modelos blade do Laravel e uma implementação mais detalhada que suporta filtragem.

Decidi implementar este código porque ele torna uma lista de itens muito fácil de rolar com base em seu histórico.

Agrupar array por data em PHP puro

Esta implementação usa a função array_reduce. Permite criar progressivamente um novo array onde cada data se torna uma chave, tendo o elemento correspondente 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;
}, []); // 



Graças ao objeto DateTime e ao método de formato você pode personalizar a lógica de agrupamento por mês ou ano, simplesmente alterando a string de formato: 'Y-m' para mês ou 'Y' para ano.

Filtragem e agrupamento

Você também pode introduzir uma função de filtro para filtrar os elementos antes de agrupá-los pelo campo de data.

$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 da função de retorno de chamada de array_filter(), especificamos a condição do filtro. Neste exemplo, mantemos apenas os elementos onde o campo ‘valor’ é maior que $filter. Você pode modificar essa condição com base no seu caso de uso específico.

Mostrando resultados na UI com lâmina Laravel

Obviamente você pode se inspirar e usar a mesma estratégia em sua tecnologia específica (como Symfony Twig ou similar).

Para manter as instruções de manipulação de dados separadas da visualização, mantenho o processo de filtragem e agrupamento no nível do controlador e implemento apenas a iteração da estrutura de dados no lado do modelo.

Aqui está o 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'));
    }
}

E aqui está a visualização da lâmina:

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

Agrupar uma coleção do Laravel por data

Graças aos utilitários integrados fornecidos pela classe Laravel Collection é realmente simples:

$groupedData = collect($data)->groupBy(function ($item) {
    return Carbon::parse($item->date)->format('Y-m-d');
});

Você pode me seguir no Linkedin ou X. Eu posto sobre como construir meu negócio SaaS.

Monitore seu aplicativo PHP gratuitamente

Inspector é uma ferramenta de monitoramento de execução de código projetada especificamente para desenvolvedores de software. Você não precisa instalar nada no nível do servidor, basta instalar o pacote do compositor e você está pronto para começar.

Inspector é super fácil e compatível com PHP. Você pode experimentar nosso pacote Laravel ou Symfony.

Se você está procurando monitoramento HTTP, insights de consulta de banco de dados e a capacidade de encaminhar alertas e notificações para seu ambiente de mensagens preferido, experimente o Inspector gratuitamente. Registre sua conta.

Ou saiba mais no site: https://inspector.dev

How to group array by date in PHP – Fast Tips

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/inspector/how-to-group-array-by-date-in-php-fast-tips-4oc0?1 Se houver alguma violação, entre em contato com study_golang@163 .com para excluí-lo
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3