Maison > Article > développement back-end > Comment regrouper un tableau par date en PHP – Conseils rapides
J'utilise cette technique pour regrouper le tableau des corrections de bugs par date dans le tableau de bord de l'Inspecteur, et j'ai pensé que cela pourrait être une bonne idée d'extrait de code pour d'autres. J'ai également écrit une implémentation pour les modèles de lames Laravel et une implémentation plus détaillée prenant en charge le filtrage.
J'ai décidé d'implémenter ce code car il permet de faire défiler une liste d'éléments si facilement en fonction de leur historique.
Cette implémentation utilise la fonction array_reduce. Il permet de créer progressivement un nouveau tableau où chaque date devient une clé, avec l'élément correspondant comme valeur.
$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; }, []); // <-- Start with an empty array
Grâce à l'objet DateTime et à la méthode format vous pouvez personnaliser la logique de regroupement par mois, ou année, en changeant simplement la chaîne de format : 'Y-m' pour mois, ou 'Y' pour année.
Vous pouvez également introduire une fonction de filtre pour filtrer les éléments avant de les regrouper par champ de date.
$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; }, []);
Dans la fonction de rappel de array_filter(), nous spécifions la condition du filtre. Dans cet exemple, nous gardons uniquement les éléments dont le champ 'value' est supérieur à $filter. Vous pouvez modifier cette condition en fonction de votre cas d'utilisation spécifique.
Vous pouvez évidemment vous inspirer et utiliser la même stratégie dans votre technologie spécifique (comme Symfony + Twig, ou similaire).
Pour garder les instructions de manipulation de données séparées de la vue, je garde le processus de filtrage et de regroupement au niveau du contrôleur, et j'implémente uniquement l'itération de la structure de données côté modèle.
Voici le contrôleur :
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')); } }
Et voici la vue de la lame :
<ul> @foreach ($groupedData as $date => $items) <li> <strong>{{ $date }}</strong> <ul> @foreach ($items as $item) <li>Value: {{ $item['value'] }}</li> @endforeach </ul> </li> @endforeach </ul>
Grâce aux utilitaires intégrés fournis par la classe Laravel Collection, c'est vraiment simple :
$groupedData = collect($data)->groupBy(function ($item) { return Carbon::parse($item->date)->format('Y-m-d'); });
Vous pouvez me suivre sur Linkedin ou X. Je publie sur la création de mon entreprise SaaS.
Inspector est un outil de surveillance de l'exécution de code spécialement conçu pour les développeurs de logiciels. Vous n'avez pas besoin d'installer quoi que ce soit au niveau du serveur, installez simplement le package composer et vous êtes prêt à partir.
Inspector est super simple et compatible PHP. Vous pouvez essayer notre package Laravel ou Symfony.
Si vous recherchez une surveillance HTTP, des informations sur les requêtes de base de données et la possibilité de transférer des alertes et des notifications vers votre environnement de messagerie préféré, essayez Inspector gratuitement. Enregistrez votre compte.
Ou apprenez-en plus sur le site : https://inspector.dev
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!