The code easy to zip files and directories in PHP

Sample Usage

//The value is the path of the file already exists.
//The key is the path in the zip file.

$files_to_zip = array(
	'file1.txt'=>'/home/file1.txt',
        'newdir/file2.txt'=>'/home/file2.txt',
        'newdir/newname.txt'=>'/home/file2.txt',
        'home/file4.txt', // equal to 'home/file4.txt'=>'/home/file4.txt',
);
//if true, good; if false, zip creation failed
$result = easy_to_zip($files_to_zip,'my-archive.zip');

 

The PHP

function addFolderToZip($dir, $zipArchive,$targetPath=''){
        if (is_dir($dir)) {
            if ($dh = opendir($dir)) {

                //Add the directory
                if($targetPath!='')
                  $zipArchive->addEmptyDir($targetPath);
                else
                  $zipArchive->addEmptyDir($dir);

                // Loop through all the files
                while (($file = readdir($dh)) !== false) {

                    //If it's a folder, run the function again!
                    if(!is_file($dir . $file)){
                        // Skip parent and root directories
                        if( ($file !== ".") && ($file !== "..")){
                            if($targetPath!='')
                              addFolderToZip($dir . $file . "/", $zipArchive,$targetPath.$file.'/');
                            else
                              addFolderToZip($dir . $file . "/", $zipArchive);
                            //echo $dir . $file;
                        }

                    }else{
                        // Add the files
                      if($targetPath!='')
                        $zipArchive->addFile($dir . $file,$targetPath. $file);
                      else
                        $zipArchive->addFile($dir . $file);

                        //echo $dir . $file;
                    }
                }
            }
        }
 }


  function easy_to_zip($files = array(),$destination = '',$overwrite = false) {
      //if the zip file already exists and overwrite is false, return false
      if(file_exists($destination) && !$overwrite) {
        echo 'Zip File already exist!';
        return false;
      }
      //vars
      $valid_files = array();
      //if files were passed in...
      if(is_array($files)) {
        //cycle through each file
        foreach($files as $targetPath => $file) {
          //make sure the file exists
          if(file_exists($file)) {
            if(is_int($targetPath))
              $valid_files[] = $file;
            else
              $valid_files[$targetPath] = $file;
          }
        }
      }

      //if we have good files...
      if(count($valid_files)) {
        //create the archive
        $zip = new ZipArchive();
        if($zip->open($destination,$overwrite ? \ZIPARCHIVE::OVERWRITE : \ZIPARCHIVE::CREATE) !== true) {
          if($overwrite && !file_exists($destination))
            echo "Can't overwrited. File doesn't exist!";
          return false;
        }
        //add the files
        foreach($valid_files as $targetPath => $file) {
          if(is_dir($file))
          {
            if(!is_int($targetPath))
              addFolderToZip($file, $zip,$targetPath);
            else
              addFolderToZip($file, $zip);
          }
          else{
            if(!is_int($targetPath))
            {
              $zip->addFile($file,$targetPath);
            }
            else
            {
              $zip->addFile($file);
            }
          }
        }
        //debug
        //echo 'The zip archive contains ',$zip->numFiles,' files with a status of ',$zip->status;

        //close the zip -- done!
        $zip->close();

        //check to make sure the file exists
        return file_exists($destination);
      }
      else
      {
        return false;
      }
  }