collection); } /** * Returns the Extra Field with the given Header ID or null * if no such Extra Field exists. * * @param int $headerId the requested Header ID * * @return ZipExtraField|null the Extra Field with the given Header ID or * if no such Extra Field exists */ public function get($headerId) { $this->validateHeaderId($headerId); return isset($this->collection[$headerId]) ? $this->collection[$headerId] : null; } /** * @param int $headerId */ private function validateHeaderId($headerId) { if ($headerId < 0 || $headerId > 0xffff) { throw new \InvalidArgumentException('$headerId out of range'); } } /** * Stores the given Extra Field in this collection. * * @param ZipExtraField $extraField the Extra Field to store in this collection * * @return ZipExtraField the Extra Field previously associated with the Header ID of * of the given Extra Field or null if no such Extra Field existed */ public function add(ZipExtraField $extraField) { $headerId = $extraField->getHeaderId(); $this->validateHeaderId($headerId); $this->collection[$headerId] = $extraField; return $extraField; } /** * @param ZipExtraField[] $extraFields */ public function addAll(array $extraFields) { foreach ($extraFields as $extraField) { $this->add($extraField); } } /** * @param ExtraFieldsCollection $collection */ public function addCollection(self $collection) { $this->addAll($collection->collection); } /** * @return ZipExtraField[] */ public function getAll() { return $this->collection; } /** * Returns Extra Field exists. * * @param int $headerId the requested Header ID * * @return bool */ public function has($headerId) { return isset($this->collection[$headerId]); } /** * Removes the Extra Field with the given Header ID. * * @param int $headerId the requested Header ID * * @return ZipExtraField|null the Extra Field with the given Header ID or null * if no such Extra Field exists */ public function remove($headerId) { $this->validateHeaderId($headerId); if (isset($this->collection[$headerId])) { $ef = $this->collection[$headerId]; unset($this->collection[$headerId]); return $ef; } return null; } /** * Whether a offset exists. * * @see http://php.net/manual/en/arrayaccess.offsetexists.php * * @param int $offset an offset to check for * * @return bool true on success or false on failure */ public function offsetExists($offset) { return isset($this->collection[(int) $offset]); } /** * Offset to retrieve. * * @see http://php.net/manual/en/arrayaccess.offsetget.php * * @param int $offset the offset to retrieve * * @return ZipExtraField|null */ public function offsetGet($offset) { return isset($this->collection[$offset]) ? $this->collection[$offset] : null; } /** * Offset to set. * * @see http://php.net/manual/en/arrayaccess.offsetset.php * * @param mixed $offset the offset to assign the value to * @param ZipExtraField $value the value to set */ public function offsetSet($offset, $value) { if (!$value instanceof ZipExtraField) { throw new \InvalidArgumentException('value is not instanceof ' . ZipExtraField::class); } $this->add($value); } /** * Offset to unset. * * @see http://php.net/manual/en/arrayaccess.offsetunset.php * * @param mixed $offset the offset to unset */ public function offsetUnset($offset) { $this->remove($offset); } /** * Return the current element. * * @see http://php.net/manual/en/iterator.current.php * * @return ZipExtraField */ public function current() { return current($this->collection); } /** * Move forward to next element. * * @see http://php.net/manual/en/iterator.next.php */ public function next() { next($this->collection); } /** * Return the key of the current element. * * @see http://php.net/manual/en/iterator.key.php * * @return int scalar on success, or null on failure */ public function key() { return key($this->collection); } /** * Checks if current position is valid. * * @see http://php.net/manual/en/iterator.valid.php * * @return bool The return value will be casted to boolean and then evaluated. * Returns true on success or false on failure. */ public function valid() { return key($this->collection) !== null; } /** * Rewind the Iterator to the first element. * * @see http://php.net/manual/en/iterator.rewind.php */ public function rewind() { reset($this->collection); } public function clear() { $this->collection = []; } /** * @return string */ public function __toString() { $formats = []; foreach ($this->collection as $key => $value) { $formats[] = (string) $value; } return implode("\n", $formats); } /** * If clone extra fields. */ public function __clone() { foreach ($this->collection as $k => $v) { $this->collection[$k] = clone $v; } } }