Извлечь содержимое папки с помощью ZipArchive

У меня сжатый_файл.zip на сайте с этой структурой:

zip-файл

Я хочу извлечь весь контент из папки version_1.x в корневую папку:

желательно

Как я могу это сделать? возможен без рекурсии?

Это возможно, но вы должны сами прочитать и написать файл, используя ZipArchive::getStream :

 $source = 'version_1.x'; $target = '/path/to/target'; $zip = new ZipArchive; $zip->open('myzip.zip'); for($i=0; $i<$zip->numFiles; $i++) { $name = $zip->getNameIndex($i); // Skip files not in $source if (strpos($name, "{$source}/") !== 0) continue; // Determine output filename (removing the $source prefix) $file = $target.'/'.substr($name, strlen($source)+1); // Create the directories if necessary $dir = dirname($file); if (!is_dir($dir)) mkdir($dir, 0777, true); // Read from Zip and write to disk $fpr = $zip->getStream($name); $fpw = fopen($file, 'w'); while ($data = fread($fpr, 1024)) { fwrite($fpw, $data); } fclose($fpr); fclose($fpw); } 

Посмотрите на документы для extractTo . Пример 1.

Я получал аналогичные ошибки @quantme при использовании решения @ netcoder. Я внес изменения в это решение, и он работает без ошибок.

 $source = 'version_1.x'; $target = '/path/to/target'; $zip = new ZipArchive; if($zip->open('myzip.zip') === TRUE) { for($i = 0; $i < $zip->numFiles; $i++) { $name = $zip->getNameIndex($i); // Skip files not in $source if (strpos($name, "{$source}/") !== 0) continue; // Determine output filename (removing the $source prefix) $file = $target.'/'.substr($name, strlen($source)+1); // Create the directories if necessary $dir = dirname($file); if (!is_dir($dir)) mkdir($dir, 0777, true); // Read from Zip and write to disk if($dir != $target) { $fpr = $zip->getStream($name); $fpw = fopen($file, 'w'); while ($data = fread($fpr, 1024)) { fwrite($fpw, $data); } fclose($fpr); fclose($fpw); } } $zip->close(); }