Для такой задачи потребуется рекурсивный обход вложенных папок, и добавление их в архив. Эту задачу (в данном случае) выполняет функция ZipDirectory, которая вызывается рекурсивно. Функция ZipFull же проверяет, возможно ли создать zip-архив, запускает ZipDirectory и закрывает файл при завершении обхода папок.
function ZipDirectory($src_dir, $zip, $dir_in_archive='') {
$dirHandle = opendir($src_dir);
while (false !== ($file = readdir($dirHandle))) {
if (($file != '.')&&($file != '..')) {
if (!is_dir($src_dir.$file)) {
$zip->addFile($src_dir.$file, $dir_in_archive.$file);
} else {
$zip->addEmptyDir($dir_in_archive.$file);
$zip = ZipDirectory($src_dir.$file.DIRECTORY_SEPARATOR,$zip,$dir_in_archive.$file.DIRECTORY_SEPARATOR);
}
}
}
return $zip;
}
function ZipFull($src_dir, $archive_path) {
$zip = new ZipArchive();
if ($zip->open($archive_path, ZIPARCHIVE::CREATE) !== true) {
return false;
}
$zip = ZipDirectory($src_dir,$zip);
$zip->close();
return true;
}
Использование, например, следующее:
if (ZipFull('D:/test/','D:/result.zip')) {
echo 'Архив успешно создан!';
} else {
echo 'Ошибка при создании архива!';
}
Более подробно про ZipArchive вы можете почитать здесь - http://php.net/manual/en/ziparchive.open.php.