5 ответов:
в зависимости от того, что вы хотите, ВАС МОЖЕТ ЗАИНТЕРЕСОВАТЬ класс хранения объектов SPL.
http://php.net/manual/en/class.splobjectstorage.php
Он позволяет использовать объекты в качестве ключей, имеет интерфейс для подсчета, получения хэша и других лакомств.
$s = new SplObjectStorage; $o1 = new stdClass; $o2 = new stdClass; $o2->foo = 'bar'; $s[$o1] = 'baz'; $s[$o2] = 'bingo'; echo $s[$o1]; // 'baz' echo $s[$o2]; // 'bingo'
создать Java, как HashMap в PHP с O (1) сложности чтения.
откройте терминал phpsh:
php> $myhashmap = array(); php> $myhashmap['mykey1'] = 'myvalue1'; php> $myhashmap['mykey2'] = 'myvalue2'; php> echo $myhashmap['mykey2']; myvalue2сложность
$myhashmap['mykey2']в этом случае появляется постоянное время O(1), Что означает, что по мере приближения размера $myhasmap к бесконечности время, необходимое для получения значения, заданного ключом, остается неизменным.доказательство чтения массива php является постоянным временем:
запустите это через PHP переводчик:
php> for($x = 0; $x < 1000000000; $x++){ ... $myhashmap[$x] = $x . " derp"; ... }цикл добавляет 1 миллиард ключей / значений, это занимает около 2 минут, чтобы добавить их все в hashmap, который может исчерпать вашу память.
затем посмотрите, сколько времени требуется для поиска:
php> system('date +%N');echo " " . $myhashmap[10333] . " ";system('date +%N'); 786946389 10333 derp 789008364Итак, как быстро выполняется поиск карты массива PHP?
The
10333это ключ, который мы искали. 1 миллион наносекунд == 1 мс. Время, необходимое для получения значения из ключа, составляет 2,06 миллиона наносекунд или около 2 миллисекунды. Примерно столько же времени, если массив был пуст. Это похоже на постоянное время для меня.
$fruits = array ( "fruits" => array("a" => "Orange", "b" => "Banana", "c" => "Apple"), "numbers" => array(1, 2, 3, 4, 5, 6), "holes" => array("first", 5 => "second", "third") ); echo $fruits["fruits"]["b"]выводит 'Banana'
HashMap, который также работает с ключами, отличными от строк и целых чисел с O(1) сложность чтения (в зависимости от качества вашей собственной хэш-функции).
вы можете сделать простой хэш-карту самостоятельно. То, что делает hashMap, - это хранение элементов в массиве с использованием хэша в качестве индекса/ключа. Хэш-функции дают коллизии время от времени (не часто, но они могут это делать), поэтому вам нужно хранить несколько элементов для записи в hashMap. Это просто hashMap:
class IEqualityComparer { public function equals($x, $y) { throw new Exception("Not implemented!"); } public function getHashCode($obj) { throw new Exception("Not implemented!"); } } class HashMap { private $map = array(); private $comparer; public function __construct(IEqualityComparer $keyComparer) { $this->comparer = $keyComparer; } public function has($key) { $hash = $this->comparer->getHashCode($key); if (!isset($this->map[$hash])) { return false; } foreach ($this->map[$hash] as $item) { if ($this->comparer->equals($item['key'], $key)) { return true; } } return false; } public function get($key) { $hash = $this->comparer->getHashCode($key); if (!isset($this->map[$hash])) { return false; } foreach ($this->map[$hash] as $item) { if ($this->comparer->equals($item['key'], $key)) { return $item['value']; } } return false; } public function del($key) { $hash = $this->comparer->getHashCode($key); if (!isset($this->map[$hash])) { return false; } foreach ($this->map[$hash] as $index => $item) { if ($this->comparer->equals($item['key'], $key)) { unset($this->map[$hash][$index]); if (count($this->map[$hash]) == 0) unset($this->map[$hash]); return true; } } return false; } public function put($key, $value) { $hash = $this->comparer->getHashCode($key); if (!isset($this->map[$hash])) { $this->map[$hash] = array(); } $newItem = array('key' => $key, 'value' => $value); foreach ($this->map[$hash] as $index => $item) { if ($this->comparer->equals($item['key'], $key)) { $this->map[$hash][$index] = $newItem; return; } } $this->map[$hash][] = $newItem; } }для того, чтобы функция вам также нужна хэш-функция для вашего ключа и компаратор для равенства (если у вас есть только несколько элементов или по другой причине не нужна скорость, вы можете позволить хэш-функции возвращать 0; все элементы будут помещены в одно ведро, и вы получите O(N) сложность)
вот пример:
class IntArrayComparer extends IEqualityComparer { public function equals($x, $y) { if (count($x) !== count($y)) return false; foreach ($x as $key => $value) { if (!isset($y[$key]) || $y[$key] !== $value) return false; } return true; } public function getHashCode($obj) { $hash = 0; foreach ($obj as $key => $value) $hash ^= $key ^ $value; return $hash; } } $hashmap = new HashMap(new IntArrayComparer()); for ($i = 0; $i < 10; $i++) { for ($j = 0; $j < 10; $j++) { $hashmap->put(array($i, $j), $i * 10 + $j); } } echo $hashmap->get(array(3, 7)) . "<br/>"; echo $hashmap->get(array(5, 1)) . "<br/>"; echo ($hashmap->has(array(8, 4))? 'true': 'false') . "<br/>"; echo ($hashmap->has(array(-1, 9))? 'true': 'false') . "<br/>"; echo ($hashmap->has(array(6))? 'true': 'false') . "<br/>"; echo ($hashmap->has(array(1, 2, 3))? 'true': 'false') . "<br/>"; $hashmap->del(array(8, 4)); echo ($hashmap->has(array(8, 4))? 'true': 'false') . "<br/>";что дает в качестве вывода:
37 51 true false false false false
Comments