Я привык к Java, где у меня есть HashSets
, ArrayLists
и другие Collections
. Но сейчас я работаю над проектом PHP.
Мне нужно создать набор, заполнить этот набор объектами (строки в этом случае), но Set может содержать только каждый объект один раз. Кроме того, я хочу удалить определенный объект в конце из этого набора, если он существует. Это было бы довольно легко с классами Java-классов. Но как я могу реализовать это в PHP?
Существуют ли какие-либо методы array()
которые мне не хватает? Я использую PHP 5.3.
Документация PHP говорит:
Массив в PHP на самом деле является упорядоченной картой. Карта – это тип, который связывает значения с ключами. Этот тип оптимизирован для нескольких различных применений; он может рассматриваться как массив, список (вектор), хеш-таблица (реализация карты), словарь, коллекция, стек, очередь и, возможно, больше. В качестве значений массива могут быть другие массивы, также возможны деревья и многомерные массивы.
Итак, maybee (!) Вам не нужен HashSet, потому что нормальный массив реализуется уже как своего рода оптимизированная структура индекса 🙂
Если это просто строки, вы можете использовать массивы в качестве наборов:
$arr['str1'] = null; $arr['str2'] = null; $arr['str1'] = null; print_r(array_keys($arr));
Вы только потенциальная проблема заключается в том, что числовые строки неявно преобразуются в целые числа, если это возможно. Но это обычно не проблема в PHP, потому что тип не имеет значения в большинстве случаев.
Я не совсем уверен, но я думаю, что SplObjectStorage
делает то, что вы хотите:
http://php.net/manual/en/class.splobjectstorage.php
О, и строки не являются объектами. Поэтому вы можете просто сделать это:
$foo['bar'] = true;
и массив будет работать как способ уникального хранения строк.
$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