Indexation d'un tableau PHP d'objets par leur classe

Publié le 17/06/2023 • Actualisé le 17/06/2023


English language detected! 🇬🇧

  We noticed that your browser is using English. Do you want to read this post in this language?

Read the english version 🇬🇧 Close

Dans ce bout de code, nous voyons comment indexer d'un tableau PHP d'objets par leur classe. On peut utiliser la fonction array_reduce au lieu de faire une boucle. Veuillez noter que l'on ne peut faire cela que si l'on est sûr que le tableau ne contient pas plusieurs instances du même type d'objets. On peut le vérifier en vérifiant le nombre des deux tableaux, celui-ci doit dont être identique.


<?php

declare(strict_types=1);

namespace App\Controller\Snippet;

use App\Samples\OrderPlacedEvent;
use App\Samples\ProductSample;
use App\Samples\SortableObject;

/**
 * J'utilise un trait PHP afin d'isoler chaque snippet dans un fichier.
 * Ce code doit être apellé d'un contrôleur Symfony étendant AbstractController (depuis Symfony 4.2)
 * ou Symfony\Bundle\FrameworkBundle\Controller\Controller (Symfony <= 4.1).
 * Les services sont injectés dans le constructeur du contrôleur principal.
 */
trait Snippet261Trait
{
    public function snippet261(): void
    {
        $objects = [
            new ProductSample(),
            new OrderPlacedEvent(),
            new SortableObject('foo'),
            // new SortableObject('bar'),
        ];
        var_dump($objects);

        $indexedByClass = array_reduce($objects, function ($carry, $item) {
            $carry[\get_class($item)] = $item;

            return $carry;
        }, []);

        var_dump($indexedByClass);

        var_dump($indexedByClass[OrderPlacedEvent::class]);

        if (\count($objects) === \count($indexedByClass)) {
            echo PHP_EOL."The array doesn't contain duplicates of the same class.";
        }

        // That's it! 😁
    }
}

 Exécuter le snippet  Plus sur Stackoverflow   Lire la doc  Snippet aléatoire

  Travaillez avec moi !