Есть ли в PHP 5.x какой-то HashSet или Set Class? - PullRequest
13 голосов
/ 19 января 2011

Я привык к Java, где у меня есть HashSets, ArrayLists и другие Collections.Но я сейчас работаю над проектом PHP.

Мне нужно создать набор, заполнить этот набор объектами (в данном случае Strings), но набор может содержать каждый объект только один раз.Кроме того, я хочу удалить определенный объект из этого набора, если он существует.Это было бы довольно легко с классами коллекции Java.Но как я могу реализовать это в PHP?

Есть ли какие-нибудь методы array(), которые мне не хватает?Я использую PHP 5.3.

Ответы [ 4 ]

6 голосов
/ 19 ноября 2011

В документации PHP написано:

Массив в PHP на самом деле является упорядоченной картой.Карта - это тип, который связывает значения с ключами.Этот тип оптимизирован для нескольких различных применений;его можно рассматривать как массив, список (вектор), хеш-таблицу (реализацию карты), словарь, коллекцию, стек, очередь и, возможно, больше.Поскольку значения массива могут быть другими массивами, деревья и многомерные массивы также возможны.

Так что, может быть (!) Вам не нужен HashSet, потому что обычный массив уже реализован как своего родаоптимизированная структура индекса:)

4 голосов
/ 19 ноября 2011

Если это просто строки, вы можете использовать массивы как наборы:

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

print_r(array_keys($arr));

Единственная потенциальная проблема в том, что числовые строки неявно преобразуются в целые числа, если это возможно. Но это обычно не проблема в PHP, потому что тип не имеет значения в большинстве случаев.

2 голосов
/ 19 января 2011

Я не совсем уверен, но я думаю SplObjectStorage делает то, что вы хотите:

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

О, и строки не являются объектамиТаким образом, вы можете просто сделать это:

$foo['bar'] = true;

и массив будет работать как способ уникального хранения строк.

0 голосов
/ 22 мая 2016
$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;
    }
}

Отпечатки: 1 3 6 4 7

...