Does PHP 5.x avez - vous une sorte de HashSet ou de Set Class?

j'ai L'habitude de Java là où j'ai HashSets,ArrayLists et Collections. Mais je travaille sur un projet PHP en ce moment.

j'ai besoin de créer un ensemble, remplir cet ensemble avec des objets (chaînes dans ce cas), mais l'ensemble ne peut contenir chaque objet qu'une seule fois. En outre, je veux supprimer un certain objet à la fin de cet ensemble s'il existe. Ce serait assez facile avec les classes Java collection. Mais comment puis-je implémenter cela en PHP?

existe-il des méthodes de array() que je suis absent? Je suis à l'aide de PHP 5.3.

12
demandé sur hakre 2011-01-19 04:00:35

4 réponses

la documentation PHP dit:

un tableau en PHP est en fait une carte ordonnée. Une carte est un type qui associe les valeurs clés. Ce type est optimisé pour plusieurs différentes utilisations; il peut être traité comme un tableau, list (vector), hash table (l'implémentation d'une carte), dictionnaire, collection, pile, la file d'attente, et probablement plus. Comme les valeurs de tableau peuvent être d'autres tableaux, les arbres et les tableaux multidimensionnels sont également possibles.

Donc maybee(!) vous n'avez pas besoin D'un HashSet, parce qu'un Tableau normal est déjà implémenté comme une sorte de structure d'index optimisée :)

6
répondu karl 2011-11-19 14:49:26

si ce ne sont que des chaînes, vous pouvez utiliser des tableaux comme sets:

$arr['str1'] = null;
$arr['str2'] = null;
$arr['str1'] = null;

print_r(array_keys($arr));

votre seul problème potentiel est que les chaînes numériques sont implicitement converties en entiers, si possible. Mais ce N'est généralement pas un problème dans PHP parce que le type n'a pas d'importance dans la plupart des circonstances.

4
répondu Artefacto 2011-11-19 15:01:51

Je ne suis pas tout à fait sûr, mais je pense SplObjectStorage est-ce que vous voulez:

http://php.net/manual/en/class.splobjectstorage.php

Oh, et les cordes ne sont pas des objets. Ainsi, vous pouvez simplement faire ceci:

$foo['bar'] = true;

et le tableau fonctionne comme une façon de mettre en magasin les chaînes.

2
répondu Matthew 2011-11-19 17:36:32
$values = array(1, 3, 6, 4, 3, 3, 7, 1);
$hashset = array();
foreach ($values as $value){
    if (!array_key_exists($value, $hashset)){
        echo $value." ";
        $hashset[$value] = true;
    }
}

empreintes: 1 3 6 4 7

0
répondu Kent Munthe Caspersen 2016-05-22 10:15:58