70 votes

Support intégré pour les ensembles en PHP ?

Je cherche un moyen simple de créer un tableau en php qui n'autorise pas les entrées en double, mais permet de combiner facilement d'autres ensembles ou tableaux.

Je suis surtout intéressé par l'existence d'une telle fonctionnalité dans le langage, car écrire la mienne ne serait pas difficile. Je ne veux simplement pas le faire si je n'en ai pas besoin.

85voto

zrvan Points 1918

Juste une idée, si vous utilisez les clés du tableau au lieu des valeurs, vous serez sûr qu'il n'y a pas de doublons, cela permet également de fusionner facilement deux "ensembles".

$set1 = array ('a' => 1, 'b' => 1, );
$set2 = array ('b' => 1, 'c' => 1, );
$union = $set1 + $set2;

17voto

chaiguy Points 7615

J'ai trouvé une solution : array_unique

Il suffit d'ajouter les éléments dans un tableau, puis d'appeler array_unique pour supprimer les doublons, ce qui permet d'obtenir le même effet. Le seul inconvénient est que vous devez vous rappeler de l'appeler. Ce serait mieux s'il y avait une classe réelle pour gérer cela, mais ceci est parfait pour mes besoins.

16voto

Full Decent Points 4453

La réponse est non, il n'y a pas de solution native en PHP. Il existe une solution Set structure des données mais ce n'est pas la ligne de base de PHP.

Il existe une convention pour implémenter les ensembles en utilisant des maps (i.e. des tableaux associatifs) dans n'importe quel langage. En PHP, vous devez utiliser true comme valeur inférieure.

<?php

$left = [1=>true, 5=>true, 7=>true];
$right = [6=>true, 7=>true, 8=>true, 9=>true];

$union = $left + $right;
$intersection = array_intersect_assoc($left, $right);

var_dump($left, $right, $union, $intersection);

4voto

Preetam Purbia Points 1070

Vous pouvez utiliser array_combine pour supprimer les doublons.

$cars = array("Volvo", "BMW", "Toyota");
array_push($cars,"BMW");

$map = array_combine($cars, $cars);

2voto

Jake Whiteley Points 435

J'ai également eu ce problème et j'ai donc écrit une classe : https://github.com/jakewhiteley/php-set-object

Comme suggéré, il étend ArrayObject et permet l'insertion, l'itération et la suppression de valeurs en mode natif, mais sans utiliser la fonction array_unique() n'importe où.

La mise en œuvre est basée sur les MDN JS Docs for Sets in EMCA 6 JavaScript.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X