<?php namespace PhpZip\Model; /** * @author Ne-Lexa alexey@nelexa.ru * @license MIT */ class ZipEntryMatcher implements \Countable { /** @var ZipContainer */ protected $zipContainer; /** @var array */ protected $matches = []; /** * ZipEntryMatcher constructor. * * @param ZipContainer $zipContainer */ public function __construct(ZipContainer $zipContainer) { $this->zipContainer = $zipContainer; } /** * @param string|ZipEntry|string[]|ZipEntry[] $entries * * @return ZipEntryMatcher */ public function add($entries) { $entries = (array) $entries; $entries = array_map( static function ($entry) { return $entry instanceof ZipEntry ? $entry->getName() : (string) $entry; }, $entries ); $this->matches = array_values( array_map( 'strval', array_unique( array_merge( $this->matches, array_keys( array_intersect_key( $this->zipContainer->getEntries(), array_flip($entries) ) ) ) ) ) ); return $this; } /** * @param string $regexp * * @return ZipEntryMatcher * * @noinspection PhpUnusedParameterInspection */ public function match($regexp) { array_walk( $this->zipContainer->getEntries(), /** * @param ZipEntry $entry * @param string $entryName */ function (ZipEntry $entry, $entryName) use ($regexp) { if (preg_match($regexp, $entryName)) { $this->matches[] = (string) $entryName; } } ); $this->matches = array_unique($this->matches); return $this; } /** * @return ZipEntryMatcher */ public function all() { $this->matches = array_map( 'strval', array_keys($this->zipContainer->getEntries()) ); return $this; } /** * Callable function for all select entries. * * Callable function signature: * function(string $entryName){} * * @param callable $callable */ public function invoke(callable $callable) { if (!empty($this->matches)) { array_walk( $this->matches, /** @param string $entryName */ static function ($entryName) use ($callable) { $callable($entryName); } ); } } /** * @return array */ public function getMatches() { return $this->matches; } public function delete() { array_walk( $this->matches, /** @param string $entryName */ function ($entryName) { $this->zipContainer->deleteEntry($entryName); } ); $this->matches = []; } /** * @param string|null $password * @param int|null $encryptionMethod */ public function setPassword($password, $encryptionMethod = null) { array_walk( $this->matches, /** @param string $entryName */ function ($entryName) use ($password, $encryptionMethod) { $entry = $this->zipContainer->getEntry($entryName); if (!$entry->isDirectory()) { $entry->setPassword($password, $encryptionMethod); } } ); } /** * @param int $encryptionMethod */ public function setEncryptionMethod($encryptionMethod) { array_walk( $this->matches, /** @param string $entryName */ function ($entryName) use ($encryptionMethod) { $entry = $this->zipContainer->getEntry($entryName); if (!$entry->isDirectory()) { $entry->setEncryptionMethod($encryptionMethod); } } ); } public function disableEncryption() { array_walk( $this->matches, /** @param string $entryName */ function ($entryName) { $entry = $this->zipContainer->getEntry($entryName); if (!$entry->isDirectory()) { $entry->disableEncryption(); } } ); } /** * Count elements of an object. * * @see http://php.net/manual/en/countable.count.php * * @return int the custom count as an integer * * @since 5.1.0 */ public function count() { return \count($this->matches); } }