Q:

zipArchive how save folder in folder

I'm writing a script that needs to archive folders and files inside, but I can not figure out how to do it if there's another folder inside one folder.  I will explain by example, so the norms work

Warning: ZipArchive::close(): Read error: Is a directory in /путь до скрипта/public_html/crm/drive/drive.php on line 102

Folder +
     File1
     File2
     And so on (so it works)

But does not want to work like that

Folder +
       File1
       FOLDER (this does not work)

The question is how to make it so that if the script saw the folder it also downloaded and if I saw the folder inside that folder also downloaded files in the folders, respectively?  Here is my script

if (isset($_POST['createPath'])) {//Check that the button is clicked
     
$zip = new ZipArchive(); // Create an archive
$zip_name = time().".zip"; // file name
if ($zip->open($zip_name, ZipArchive::CREATE) ! == true) { // open file
  die ("Could not open archive");//If the file does not open
}
$var = $_POST["pathUpload"];// Array of variables that are passed through the form
foreach ($var as $key_var) {//  We process the array in a loop
$iterator = new RecursiveDirectoryIterator($key_var);//There is a recursive search of the file system directories
foreach ($iterator as $key => $value) {// We process an array of files
  $path = pathinfo($value);//Check the path or revert the path to the file
  if ($path['basename'] == '.'  || $path['basename'] == '..') continue;//Check those files that you download if there are points in the files then download

  $zip->addFile(realpath($key), $key);//Add the file to the server


 
}

$zip->close();//Close archive
    if (file_exists($zip_name)) {
        // Give the file to download
        header('Content-type: application/zip', 'charset=utf-8');
        header('Content-Disposition: attachment; filename="'.$zip_name.'"'); 
         ob_end_flush();//Buffering since without it nothing will work
        readfile($zip_name); //Read the file

        unlink($zip_name);//Delete the variable
    }
 }

}  

A:

The error because you are trying to add directory to Zip with method
// this function only for adding files! 
public function addFile ($filename, $localname = null, $start = 0, $length = 0) {}

the method allows you to add directory 
public function addEmptyDir ($dirname) {}

The other issue you have, is you are using directory iterator in wrong way.   
// this way only loop on directories in 
$iterator = new RecursiveDirectoryIterator($key_var);//There is a recursive search of the file system directories

the right way is to use RecursiveIteratorIterator on RecursiveDirectoryIterator - have a look the options in the docs. 
example: 
 // the right way to recursive get list of the file system directories and files
$iterator = new RecursiveIteratorIterator(
            new RecursiveDirectoryIterator($key_var, RecursiveDirectoryIterator::SKIP_DOTS), // skip .  and ..
            RecursiveIteratorIterator::SELF_FIRST,
            RecursiveIteratorIterator::CATCH_GET_CHILD // Ignore "Permission denied"
);

so to get it to work, your code should look like this: 
<? php

if (isset($_POST['createPath'])) {//Check that the button is clicked

    $zip      = new ZipArchive(); // Create an archive
    $zip_name = time() . " .zip"; // file name
    if ($zip->open($zip_name, ZipArchive::CREATE) ! == true) { // open file
        die ("Could not open archive");//If the file does not open
    }

    $var = $_POST["pathUpload"];// Array of variables that are passed through the form
    foreach ($var as $key_var) {//  We process the array in a loop

        // There is a recursive search of the file system directories
        $iterator = new RecursiveIteratorIterator(
            new RecursiveDirectoryIterator($key_var, RecursiveDirectoryIterator::SKIP_DOTS), // skip .  and ..
            RecursiveIteratorIterator::SELF_FIRST,
            RecursiveIteratorIterator::CATCH_GET_CHILD // Ignore "Permission denied"
        );

        // all directories and subdir
        foreach ($iterator as $path => $dir) {
            if (! $dir->isDir()) && is_file($path) { 
                $zip->addFile(realpath($path)); //Add the file to the server
            }
            if ($dir->isDir()) {
                // do nothing
            }
        }

        $zip->close(); //Close archive
        if (file_exists($zip_name)) {
            // Give the file to download
            header('Content-type: application/zip', 'charset=utf-8');
            header('Content-Disposition: attachment; filename="' .  $zip_name . '"'); 
            ob_end_flush();//Buffering since without it nothing will work
            readfile($zip_name); //Read the file

            unlink($zip_name);//Delete the variable
        }
    }

}

happy coding :)

