open( $destination, ZIPARCHIVE::CREATE ) === true ) { $source = realpath( $source ); if ( is_dir( $source ) ) { $iterator = new RecursiveDirectoryIterator( $source ); $iterator->setFlags( RecursiveDirectoryIterator::SKIP_DOTS ); $files = new RecursiveIteratorIterator( $iterator, RecursiveIteratorIterator::SELF_FIRST ); foreach ( $files as $file ) { $file = realpath( $file ); if ( is_dir( $file ) ) { $zip->addEmptyDir( str_replace( $source . DIRECTORY_SEPARATOR, '', $file . DIRECTORY_SEPARATOR ) ); } else if ( is_file( $file ) ) { $zip->addFile( $file, str_replace( $source . DIRECTORY_SEPARATOR, '', $file ) ); } } } else if ( is_file( $source ) ) { $zip->addFile( $source, basename( $source ) ); } } return $zip->close(); }