Création d'une matrice à "n" dimensions avec PHP

Publié le 01/01/2022 • Actualisé le 01/01/2022


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 créer une matrice à "n" dimensions avec PHP. Dans le précédent snippet, nous avons vu comment créer un tableau à deux dimensions ; cette fois, nous utilisons une fonction récursive pour créer un tableau multi-dimensionnel avec une profondeur donnée comme argument. Bien sûr, la version à deux dimensions est facile à créer manuellement, mais à partir de trois et plus, ça devient moins évident. C'est là que la fonction récursive vient à la rescousse. Si vous avez des problèmes à visualiser les tableaux générés, regardez les tests unitaires. Cela vous aidera surement à vous en faire une image bien plus claire. 😉


<?php

declare(strict_types=1);

namespace App\Controller\Snippet;

/**
 * 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 Snippet182Trait
{
    /**
     * @noinspection PhpRedundantOptionalArgumentInspection
     * @noinspection ArgumentEqualsDefaultValueInspection
     */
    public function snippet182(): void
    {
        $matrix2 = $this->createMatrix(startIndex: 1, dimensions: 2, defaultValue: '');
        $matrix3 = $this->createMatrix(startIndex: 1, dimensions: 3, defaultValue: null);

        var_dump($matrix2);
        var_dump($matrix3);

        echo 'OK';

        // That's it! 😁
    }

    /**
     * @return array<mixed>
     */
    private function createMatrix(int $startIndex = 1, int $dimensions = 2, mixed $defaultValue = '', ?int $iterations = null): array
    {
        if ($iterations === null) {
            $iterations = $dimensions;
        }

        if ($iterations <= 1) {
            return array_fill($startIndex, $dimensions, $defaultValue);
        }

        return array_fill($startIndex, $dimensions, $this->createMatrix($startIndex, $dimensions, $defaultValue, $iterations - 1));
    }
}

 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

  Travaillez avec moi !

<?php

declare(strict_types=1);

namespace App\Tests\Integration\Controller\Snippets;

use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;

/**
 * @see Snippet182Trait
 */
final class Snippet182Test extends KernelTestCase
{
    /**
     * @see Snippet181Trait::snippet181
     *
     * @noinspection PhpRedundantOptionalArgumentInspection
     * @noinspection ArgumentEqualsDefaultValueInspection
     */
    public function testSnippet181(): void
    {
        /** @var array{1: array<string>, 2:array<string>} $matrix2 */
        $matrix2 = $this->createMatrix(startIndex: 1, dimensions: 2, defaultValue: '');
        self::assertCount(2, $matrix2);
        self::assertCount(2, $matrix2[1]);
        self::assertCount(2, $matrix2[2]);
        self::assertSame('', $matrix2[2][1]);

        /** @var array{1: array<array<string>>, 2:array<array<string>>, 3:array<array<string>>} $matrix3 */
        $matrix3 = $this->createMatrix(startIndex: 1, dimensions: 3, defaultValue: null);
        self::assertCount(3, $matrix3);
        self::assertCount(3, $matrix3[1]);
        self::assertCount(3, $matrix3[2]);
        self::assertCount(3, $matrix3[3]);
        self::assertCount(3, $matrix3[1][1]);
        self::assertCount(3, $matrix3[1][2]);
        self::assertCount(3, $matrix3[1][3]);
        self::assertNull($matrix3[1][3][1]);
    }

    /**
     * @return array<mixed>
     */
    private function createMatrix(int $startIndex = 1, int $dimensions = 2, mixed $defaultValue = '', ?int $iterations = null): array
    {
        if ($iterations === null) {
            $iterations = $dimensions;
        }

        if ($iterations <= 1) {
            return array_fill($startIndex, $dimensions, $defaultValue);
        }

        return array_fill($startIndex, $dimensions, $this->createMatrix($startIndex, $dimensions, $defaultValue, $iterations - 1));
    }
}