Comment regrouper un tableau par date en PHP – Conseils rapides

王林
Libérer: 2024-09-04 18:31:19
original
779 Les gens l'ont consulté

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.

Regrouper le tableau par date en PHP pur

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
Copier après la connexion

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.

Filtrage et regroupement

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;
    }, []);
Copier après la connexion

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.

Affichage des résultats dans l'interface utilisateur avec la lame Laravel

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'));
    }
}
Copier après la connexion

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>
Copier après la connexion

Regrouper une collection Laravel par date

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');
});
Copier après la connexion

Vous pouvez me suivre sur Linkedin ou X. Je publie sur la création de mon entreprise SaaS.

Surveillez votre application PHP gratuitement

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

How to group array by date in PHP – Fast Tips

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!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal