addFromSource($pSource); } } /** * Add HashTable items from source * * @param PhpOffice\PhpWord\IComparable[] $pSource Source array to create HashTable from * @throws Exception */ public function addFromSource($pSource = null) { // Check if an array was passed if ($pSource == null) { return; } elseif (!is_array($pSource)) { throw new Exception('Invalid array parameter passed.'); } foreach ($pSource as $item) { $this->add($item); } } /** * Add HashTable item * * @param PhpOffice\PhpWord\IComparable $pSource Item to add * @throws Exception */ public function add(IComparable $pSource = null) { // Determine hashcode $hashCode = null; $hashIndex = $pSource->getHashIndex(); if (is_null($hashIndex)) { $hashCode = $pSource->getHashCode(); } elseif (isset ($this->_keyMap[$hashIndex])) { $hashCode = $this->_keyMap[$hashIndex]; } else { $hashCode = $pSource->getHashCode(); } // Add value if (!isset($this->_items[$hashCode])) { $this->_items[$hashCode] = $pSource; $index = count($this->_items) - 1; $this->_keyMap[$index] = $hashCode; $pSource->setHashIndex($index); } else { $pSource->setHashIndex($this->_items[$hashCode]->getHashIndex()); } } /** * Remove HashTable item * * @param PhpOffice\PhpWord\IComparable $pSource Item to remove * @throws Exception */ public function remove(IComparable $pSource = null) { if (isset($this->_items[$pSource->getHashCode()])) { unset($this->_items[$pSource->getHashCode()]); $deleteKey = -1; foreach ($this->_keyMap as $key => $value) { if ($deleteKey >= 0) { $this->_keyMap[$key - 1] = $value; } if ($value == $pSource->getHashCode()) { $deleteKey = $key; } } unset($this->_keyMap[count($this->_keyMap) - 1]); } } /** * Clear HashTable * */ public function clear() { $this->_items = array(); $this->_keyMap = array(); } /** * @return int */ public function count() { return count($this->_items); } /** * @param string $pHashCode * @return int Index */ public function getIndexForHashCode($pHashCode = '') { return array_search($pHashCode, $this->_keyMap); } /** * @param int $pIndex * @return PhpOffice\PhpWord\IComparable */ public function getByIndex($pIndex = 0) { if (isset($this->_keyMap[$pIndex])) { return $this->getByHashCode($this->_keyMap[$pIndex]); } return null; } /** * @param string $pHashCode * @return PhpOffice\PhpWord\IComparable * */ public function getByHashCode($pHashCode = '') { if (isset($this->_items[$pHashCode])) { return $this->_items[$pHashCode]; } return null; } /** * @return PhpOffice\PhpWord\IComparable[] */ 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; } } } }