open($destination, $overwrite ? \ZipArchive::CREATE | \ZipArchive::OVERWRITE : \ZipArchive::CREATE)) { return false; } /** @var array $sources */ foreach ($sources as $source => $relative) { $source = str_replace('\\', '/', realpath($source)); if (!file_exists($source)) { continue; } if (is_dir($source)) { $files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($source), \RecursiveIteratorIterator::SELF_FIRST); foreach ($files as $file) { $file = str_replace('\\', '/', $file); /* Ignore . and .. */ if (in_array(mb_substr($file, mb_strrpos($file, '/') + 1), ['.', '..'])) { continue; } $absolute = realpath($file); $absolute = str_replace('\\', '/', $absolute); $dir = str_replace($source . '/', '', $relative . '/' . $absolute); if (is_dir($absolute)) { $zip->addEmptyDir($dir . '/'); } elseif (is_file($absolute)) { $zip->addFile($absolute, $dir); } } } elseif (is_file($source)) { $zip->addFile($source, $relative); } } return $zip->close(); } /** * {@inheritdoc} */ public static function unpack(string $source, string $destination) : bool { if (!file_exists($source)) { return false; } $destination = str_replace('\\', '/', $destination); $destination = rtrim($destination, '/'); $zip = new \ZipArchive(); if (!$zip->open($source)) { return false; } $zip->extractTo($destination . '/'); return $zip->close(); } }