See Release Notes
Long Term Support Release
<?php namespace PhpOffice\PhpSpreadsheet;> /** class HashTable > * @template T of IComparable { > *//** * HashTable elements. *< * @var IComparable[]> * @var array<string, T>*/ protected $items = []; /** * HashTable key map. *< * @var string[]> * @var array<int, string>*/ protected $keyMap = []; /**< * Create a new \PhpOffice\PhpSpreadsheet\HashTable. < * < * @param IComparable[] $pSource Optional source array to create HashTable from> * Create a new HashTable.*< * @throws Exception> * @param T[] $source Optional source array to create HashTable from*/< public function __construct($pSource = null)> public function __construct($source = null){< if ($pSource !== null) {> if ($source !== null) {// Create HashTable< $this->addFromSource($pSource);> $this->addFromSource($source);} } /** * Add HashTable items from source. *< * @param IComparable[] $pSource Source array to create HashTable from < * < * @throws Exception> * @param T[] $source Source array to create HashTable from*/< public function addFromSource(array $pSource = null)> public function addFromSource(?array $source = null): void{ // Check if an array was passed< if ($pSource == null) {> if ($source === null) {return; }< foreach ($pSource as $item) {> foreach ($source as $item) {$this->add($item); } } /** * Add HashTable item. *< * @param IComparable $pSource Item to add> * @param T $source Item to add*/< public function add(IComparable $pSource)> public function add(IComparable $source): void{< $hash = $pSource->getHashCode();> $hash = $source->getHashCode();if (!isset($this->items[$hash])) {< $this->items[$hash] = $pSource;> $this->items[$hash] = $source;$this->keyMap[count($this->items) - 1] = $hash; } } /** * Remove HashTable item. *< * @param IComparable $pSource Item to remove> * @param T $source Item to remove*/< public function remove(IComparable $pSource)> public function remove(IComparable $source): void{< $hash = $pSource->getHashCode();> $hash = $source->getHashCode();if (isset($this->items[$hash])) { unset($this->items[$hash]); $deleteKey = -1; foreach ($this->keyMap as $key => $value) { if ($deleteKey >= 0) { $this->keyMap[$key - 1] = $value; } if ($value == $hash) { $deleteKey = $key; } } unset($this->keyMap[count($this->keyMap) - 1]); } } /** * Clear HashTable. */< public function clear()> public function clear(): void{ $this->items = []; $this->keyMap = []; } /** * Count. * * @return int */ public function count() { return count($this->items); } /** * Get index for hash code. *< * @param string $pHashCode < * < * @return int Index> * @return false|int Index*/< public function getIndexForHashCode($pHashCode)> public function getIndexForHashCode(string $hashCode){< return array_search($pHashCode, $this->keyMap);> // Scrutinizer thinks the following could return string. It is wrong. > return array_search($hashCode, $this->keyMap, true);} /** * Get by index. *< * @param int $pIndex < * < * @return IComparable> * @return null|T*/< public function getByIndex($pIndex)> public function getByIndex(int $index){< if (isset($this->keyMap[$pIndex])) { < return $this->getByHashCode($this->keyMap[$pIndex]);> if (isset($this->keyMap[$index])) { > return $this->getByHashCode($this->keyMap[$index]);} return null; } /** * Get by hashcode. *< * @param string $pHashCode < * < * @return IComparable> * @return null|T*/< public function getByHashCode($pHashCode)> public function getByHashCode(string $hashCode){< if (isset($this->items[$pHashCode])) { < return $this->items[$pHashCode];> if (isset($this->items[$hashCode])) { > return $this->items[$hashCode];} return null; } /** * HashTable to array. *< * @return IComparable[]> * @return T[]*/ public function toArray() { return $this->items; } /** * Implement PHP __clone to create a deep clone, not just a shallow copy. */ public function __clone() { $vars = get_object_vars($this); foreach ($vars as $key => $value) {< if (is_object($value)) { < $this->$key = clone $value;> // each member of this class is an array > if (is_array($value)) { > $array1 = $value; > foreach ($array1 as $key1 => $value1) { > if (is_object($value1)) { > $array1[$key1] = clone $value1; > } > } > $this->$key = $array1;} } } }