Questa è la library scaricata da zend.com

Codice PHP:
<?php 

/* 

Zip file creation class 
makes zip files on the fly... 

use the functions add_dir() and add_file() to build the zip file; 
see example code below 

by Eric Mueller 
[url]http://www.themepark.com[/url] 

v1.1 9-20-01 
  - added comments to example 

v1.0 2-5-01 

initial version with: 
  - class appearance 
  - add_file() and file() methods 
  - gzcompress() output hacking 
by Denis O.Philippov, [email]webmaster@atlant.ru[/email], [url]http://www.atlant.ru[/url] 

*/ 

// official ZIP file format: [url]http://www.pkware.com/appnote.txt[/url] 

class zipfile   
{   

    var 
$datasec = array(); // array to store compressed data 
    
var $ctrl_dir = array(); // central directory    
    
var $eof_ctrl_dir "\x50\x4b\x05\x06\x00\x00\x00\x00"//end of Central directory record 
    
var $old_offset 0

    function 
add_dir($name)    

    
// adds "directory" to archive - do this before putting any files in directory! 
    // $name - name of directory... like this: "path/" 
    // ...then you can add files using add_file with names like "path/file.txt" 
    
{   
        
$name str_replace("\\""/"$name);   

        
$fr "\x50\x4b\x03\x04"
        
$fr .= "\x0a\x00";    // ver needed to extract 
        
$fr .= "\x00\x00";    // gen purpose bit flag 
        
$fr .= "\x00\x00";    // compression method 
        
$fr .= "\x00\x00\x00\x00"// last mod time and date 

        
$fr .= pack("V",0); // crc32 
        
$fr .= pack("V",0); //compressed filesize 
        
$fr .= pack("V",0); //uncompressed filesize 
        
$fr .= pack("v"strlen($name) ); //length of pathname 
        
$fr .= pack("v"); //extra field length 
        
$fr .= $name;   
        
// end of "local file header" segment 

        // no "file data" segment for path 

        // "data descriptor" segment (optional but necessary if archive is not served as file) 
        
$fr .= pack("V",$crc); //crc32 
        
$fr .= pack("V",$c_len); //compressed filesize 
        
$fr .= pack("V",$unc_len); //uncompressed filesize 

        // add this entry to array 
        
$this -> datasec[] = $fr

        
$new_offset strlen(implode(""$this->datasec)); 

        
// ext. file attributes mirrors MS-DOS directory attr byte, detailed 
        // at [url]http://support.microsoft.com/support/kb/articles/Q125/0/19.asp[/url] 

        // now add to central record 
        
$cdrec "\x50\x4b\x01\x02"
        
$cdrec .="\x00\x00";    // version made by 
        
$cdrec .="\x0a\x00";    // version needed to extract 
        
$cdrec .="\x00\x00";    // gen purpose bit flag 
        
$cdrec .="\x00\x00";    // compression method 
        
$cdrec .="\x00\x00\x00\x00"// last mod time & date 
        
$cdrec .= pack("V",0); // crc32 
        
$cdrec .= pack("V",0); //compressed filesize 
        
$cdrec .= pack("V",0); //uncompressed filesize 
        
$cdrec .= pack("v"strlen($name) ); //length of filename 
        
$cdrec .= pack("v"); //extra field length    
        
$cdrec .= pack("v"); //file comment length 
        
$cdrec .= pack("v"); //disk number start 
        
$cdrec .= pack("v"); //internal file attributes 
        
$ext "\x00\x00\x10\x00"
        
$ext "\xff\xff\xff\xff";   
        
$cdrec .= pack("V"16 ); //external file attributes  - 'directory' bit set 

        
$cdrec .= pack("V"$this -> old_offset ); //relative offset of local header 
        
$this -> old_offset $new_offset

        
$cdrec .= $name;   
        
// optional extra field, file comment goes here 
        // save to array 
        
$this -> ctrl_dir[] = $cdrec;   

          
    } 


    function 
add_file($data$name)    

    
// adds "file" to archive    
    // $data - file contents 
    // $name - name of file in archive. Add path if your want 

    
{   
        
$name str_replace("\\""/"$name);   
        
//$name = str_replace("\\", "\\\\", $name); 

        
$fr "\x50\x4b\x03\x04"
        
$fr .= "\x14\x00";    // ver needed to extract 
        
$fr .= "\x00\x00";    // gen purpose bit flag 
        
$fr .= "\x08\x00";    // compression method 
        
$fr .= "\x00\x00\x00\x00"// last mod time and date 

        
$unc_len strlen($data);   
        
$crc crc32($data);   
        
$zdata gzcompress($data);   
        
$zdata substrsubstr($zdata0strlen($zdata) - 4), 2); // fix crc bug 
        
$c_len strlen($zdata);   
        
$fr .= pack("V",$crc); // crc32 
        
$fr .= pack("V",$c_len); //compressed filesize 
        
$fr .= pack("V",$unc_len); //uncompressed filesize 
        
$fr .= pack("v"strlen($name) ); //length of filename 
        
$fr .= pack("v"); //extra field length 
        
$fr .= $name;   
        
// end of "local file header" segment 
          
        // "file data" segment 
        
$fr .= $zdata;   

        
// "data descriptor" segment (optional but necessary if archive is not served as file) 
        
$fr .= pack("V",$crc); //crc32 
        
$fr .= pack("V",$c_len); //compressed filesize 
        
$fr .= pack("V",$unc_len); //uncompressed filesize 

        // add this entry to array 
        
$this -> datasec[] = $fr

        
$new_offset strlen(implode(""$this->datasec)); 

        
// now add to central directory record 
        
$cdrec "\x50\x4b\x01\x02"
        
$cdrec .="\x00\x00";    // version made by 
        
$cdrec .="\x14\x00";    // version needed to extract 
        
$cdrec .="\x00\x00";    // gen purpose bit flag 
        
$cdrec .="\x08\x00";    // compression method 
        
$cdrec .="\x00\x00\x00\x00"// last mod time & date 
        
$cdrec .= pack("V",$crc); // crc32 
        
$cdrec .= pack("V",$c_len); //compressed filesize 
        
$cdrec .= pack("V",$unc_len); //uncompressed filesize 
        
$cdrec .= pack("v"strlen($name) ); //length of filename 
        
$cdrec .= pack("v"); //extra field length    
        
$cdrec .= pack("v"); //file comment length 
        
$cdrec .= pack("v"); //disk number start 
        
$cdrec .= pack("v"); //internal file attributes 
        
$cdrec .= pack("V"32 ); //external file attributes - 'archive' bit set 

        
$cdrec .= pack("V"$this -> old_offset ); //relative offset of local header 
//        echo "old offset is ".$this->old_offset.", new offset is $new_offset
"; 
        
$this -> old_offset = $new_offset

        
$cdrec .= $name;   
        // optional extra field, file comment goes here 
        // save to central directory 
        
$this -> ctrl_dir[] = $cdrec;   
    } 

    function file() { // dump out file    
        
$data = implode("", $this -> datasec);   
        
$ctrldir = implode("", $this -> ctrl_dir);   

        return    
            
$data.   
            
$ctrldir.   
            
$this -> eof_ctrl_dir.   
            pack("
v", sizeof($this -> ctrl_dir)).     // total # of entries "on this disk
            pack("
v", sizeof($this -> ctrl_dir)).     // total # of entries overall 
            pack("
V", strlen($ctrldir)).             // size of central dir 
            pack("
V", strlen($data)).                 // offset to start of central dir 
            "
\x00\x00";                             // .zip file comment length 
    } 
}   

?>
Per comodità,salvatela in un file esterno (In seguito la dovrete richiamare con include)..

Adesso create un'altro file,con il seguente codice

Codice PHP:
<?php 
include ("nome_della_libreria.php");
$zipfile = new zipfile();   

$zipfile -> add_dir("dir/"); 

$filedata "(read your file into $filedata)";   
$zipfile -> add_file($filedata"dir/file.txt");   

$filename "output.zip"
$fd fopen ($filename"wb"); 
$out fwrite ($fd$zipfile -> file()); 
fclose ($fd); 

echo 
"<a href=\"output.zip\">Click here to download the new zip file.</a>";

?>
Allora analizziamo il tutto

Includete la libreria precedentemente creata,in tal modo che il file che crea gli zip ne possa usufruire
Codice PHP:
include ("nome_della_libreria.php"); 
Aggiunge una subdirectory al file zip che conterrà i file che verranno creati in seguito..

Codice PHP:
$zipfile -> add_dir("dir/"); 
All'interno di filedata và inserito il contenuto del file che verrà creato in seguito
Codice PHP:
$filedata "(read your file into $filedata)"

Inserite il nome del file da creare,con la relativa directory (ricordate che la directory deve essere uguale ad una di quelle create in precedenza all'interno del file zip
Codice PHP:
$zipfile -> add_file($filedata"dir/file.txt"); 


Inserite in filename il nome del file zip che verrà creato
Codice PHP:
$filename "output.zip"
$fd fopen ($filename"wb"); 
$out fwrite ($fd$zipfile -> file()); 
fclose ($fd); 
Per finire inserite in href il nome del file zip che l'utente dovrà scaricare
Codice PHP:
echo "<a href=\"output.zip\">Click here to download the new zip file.</a>"
Fine