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.
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:
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.
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
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