[PHP] Utiliser array_reduce avec une fonction anonyme pour extraire un résultat d'un tableau

Publié le 11/07/2020 • Mis à jour le 11/07/2020


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 allons voir comment extraire un résultat d'un tableau à l'aide de la fonction array_reduce et d'une fonction anonyme. Je récupère tous les articles de la base de données puis je calcule deux comptes : le nombre de posts et le nombre de snippets. Bien sûr, c'est juste pour l'exemple, ici il aurait été plus judicieux de récupérer ces résultats avec du SQL.


<?php declare(strict_types=1);

// src/Controller/Snippet/Snippet100Trait.php

namespace App\Controller\Snippet;

use App\Entity\Article;
use App\Repository\ArticleRepository;

/**
 * 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.
 *
 * @property ArticleRepository $articleRepo
 */
trait Snippet100Trait
{
    public function snippet100(): void
    {
        $articles = $this->articleRepo->findActive();

        $postsCount = array_reduce($articles, static function ($carry, Article $article) {
            return $carry + ($article->isArticle() ? 1 : 0);
        });

        $snippetsCount = array_reduce($articles, static function ($carry, Article $article) {
            return $carry + ($article->isSnippet() ? 1 : 0);
        });

        echo 'Articles count:'.count($articles).PHP_EOL;
        echo 'Blog posts count:'.$postsCount.PHP_EOL;
        echo 'Snippets count:'.$snippetsCount;

        // That's it! 😁
    }
}

 Exécuter le snippet  ≪ this.showUnitTest ? this.trans.hide_unit_test : this.trans.show_unit_test ≫  Plus sur Stackoverflow   Lire la doc  Snippet aléatoire

<?php declare(strict_types=1);

namespace App\Tests\Controller\Snippets;

use App\Entity\Article;
use App\Repository\ArticleRepository;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;

/**
 * @covers Snippet100Trait
 */
final class Snippet100Test extends KernelTestCase
{
    private ArticleRepository $articleRepo;

    protected function setUp(): void
    {
        self::bootKernel();
        $this->articleRepo = self::$container->get(ArticleRepository::class);
    }

    /**
     * @covers Snippet100Trait::snippet100
     */
    public function testSnippet100(): void
    {
        $articles = $this->articleRepo->findActive();
        $postsCount = array_reduce($articles, static function ($carry, Article $article) {
            return $carry + ($article->isArticle() ? 1 : 0);
        });
        $snippetsCount = array_reduce($articles, static function ($carry, Article $article) {
            return $carry + ($article->isSnippet() ? 1 : 0);
        });

        // An article is either a blog post or a snippet, the article type is mandatory
        self::assertSame(count($articles), $postsCount+$snippetsCount);
    }
}