Création d'une matrice à "n" dimensions avec PHP
Publié le 01/01/2022 • Actualisé le 01/01/2022
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
<?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));
}
}