Предположим, мне нужно добавить и удалить элементы из массива, где они должны быть уникальными.
Class A {
protected $elements = [];
function add($element) {
if (!in_array($element, $this->elements)) {
$this->elements[] = $element;
}
}
function remove($element) {
if (($key = array_search($element, $this->elements)) !== false) {
unset($this->elements[$key]);
}
}
}
Это выглядит хорошо, но если $elements
имеет много элементов в нем PHP должен будет повторяться каждый раз add()
или же remove()
называется. Вместо этого я могу сделать это:
Class A {
protected $elements = [];
function add($element) {
$this->elements[$element] = true;
}
function remove($element) {
unset($this->elements[$element]);
}
}
Который должен выполнять с той же скоростью, независимо от количества элементов, но я могу быть совершенно неправ в этом, и в этом суть этого вопроса.
Я делал это повсеместно в своих кодах, но меня беспокоит, что я храню кучу бесполезной информации (в этом примере некоторые true
булевы), которые служат абсолютно бесполезно, но не могут обойтись без них. Это выглядит как какой-то недостаток и заставляет меня думать, что этот метод не является полностью пуленепробиваемым, как мне кажется.
Является ли этот способ хранения информации в массивах лучше, чем то, что, я полагаю, будет считаться надлежащим образом, Первый пример и есть ли у него недостатки, кроме хранения ненужной информации?
Ваше второе решение будет значительно быстрее первого.
Недостатком является то, что это займет значительно больше памяти, и что вы можете хранить только целые числа и подобные строки.
Если вы выполняете много операций по добавлению / удалению на достаточно большом количестве элементов — перейдите ко второму решению.
Если вы ожидаете сотни тысяч или даже миллион элементов — тогда второе решение может пойти с исключением из-за нехватки памяти — поэтому вам следует использовать первое.
Других решений пока нет …