Скрипт по распаковкe zip

Использую этот скрипт

$zip = new ZipArchive; 
$res = $zip->open('file.zip'); 
if ($res === TRUE) { 
  $zip->extractTo('/myzips/extract_path/'); 
  $zip->close(); 
  echo 'woot!'; 
} else { echo 'doh!'; }

Он распаковывает один архив, нужно чтобы он распаковывал все архивы в папке, подпапках. И ещё нужно, чтобы зип после распаковки удалялся.

Может кто-то уже сталкивался с этим? Подскажите как доделать.


Ответы (1 шт):

Автор решения: NaClnik

я написал для Вас скрипт, который рекурсивно распаковывает архив zip. Я постарался максимально задокументировать свой код комментариями, чтобы Вам было максимально понятно. Буду рад, если этот код кому-нибудь пригодится!)

<?php

// Вызов функции, которая распаковывает zip архив.
unpackZipArchive(__DIR__.'\\assets\\src\\sasa.zip', __DIR__.'\\assets\\updated\\');

// В качестве параметров передаём:
// path: Путь к zip-архиву
// unpackToPath: Путь к директории, в которую нужно распаковать архив.
function unpackZipArchive(string $path, string $unpackToPath){
    // Создаём новый экземпляр архива.
    $zip = new ZipArchive();

    // Открываем архив.
    $zip->open($path);

    // Получаем нахвание архива из пути без расширения .zip.
    $filename = getFileNameWithoutExtension($path);

    // Получаем путь к распаковываемой директории с именем архива.
    $unpackToPath = $unpackToPath.$filename;

    // Распаковываем архив.
    $zip->extractTo($unpackToPath);

    // Закрываем архив, чтобы можно было его удалить.
    $zip->close();

    // Удаляем архив.
    unlink($path);

    // Если в распакованной директории больше нет архивов, то выходим из рекурсивного метода.
    if(isNoZipArchivesInDirectory($unpackToPath)){
        return;
    } // if.

    // Получаем все архивы, которые находятся в директории и ходим по ним.
    foreach (getZipPaths($unpackToPath) as $path){
        $temp = $unpackToPath.'\\'.getFileNameWithoutExtension($path);

        // Рекурсивный вызов.
        unpackZipArchive($temp.'.zip', $unpackToPath.'\\');
    } // foreach.
} // unpackZipArchive.

// Функция, которая возвращает массив с названиями всех архивов.
function getZipPaths(string $path){
    $dir = opendir($path);

    $list = [];

    while (($file = readdir($dir)) != false) {
        if(getFileExtension($file) == 'zip'){
            array_push($list, $file);
        }
    }

    closedir($dir);

    return $list;
} // getZipPaths.

// Получение названия файла без расширения по пути.
function getFileNameWithoutExtension(string $path){
    $segments = explode('\\', $path);

    $filenameWithExtension = end($segments);

    return explode('.', $filenameWithExtension)[0];
} // getFileName.

// Функция, которая возвращает значение: есть ли в указанной директории архивы.
function isNoZipArchivesInDirectory(string $path): bool{
    $dir = opendir($path);

    $flag = true;

    while (($file = readdir($dir)) != false) {
        if(getFileExtension($file) == 'zip'){
            $flag = false;
            break;
        }
    }

    closedir($dir);

    return $flag;
} // noZipArchivesInDirectory.

// Полуение расширения из имени файла.
function getFileExtension(string $filename){
    $fileNameSegments = explode('.', $filename);

    return end($fileNameSegments);
} // getFileExtension.
→ Ссылка