質問: array_diff(scandir($path), ['.', '..']); foreach ($files as $file) addZip($zip, "$path/$file"); } else { $zip->addFile($path); } } // ストリームに出力 header('Content-Type: application/zip; name="' . $dist . '"'); header('Content-Disposition: attachment; filename="' . $dist . '"'); header('Content-Length: '.filesize($zipTmpDir.$dist)); echo file_get_contents($zipTmpDir.$dist); // 一時ファイルを削除しておく unlink($zipTmpDir.$dist); ```
回答: 自己解決することが出来ました。 皆様回答ありがとうございました。 全てのファイルパスを、 > > 圧縮したいフォルダ名/(サブフォルダ名)/ファイル名 > > > このように統一して1つの配列にまとめ、addFileでzipに追加、圧縮という形になっています。 サブフォルダはいくつあっても問題ありませんでした。 空のサブフォルダが存在していてもエラーは出ません。 しかし、圧縮したzipには空のサブフォルダは作られません。 以下がコードです。 ``` open($zipTmpDir.$zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); if ($result !== true) { return false; } //処理制限時間を外す set_time_limit(0); //パス取得 $fpath_array_beta = array_diff(scandir($path), ['.', '..']); // zip追加する本命のパスを格納する配列 $fpath_array = array(); // ディレクトリ判別 foreach ($fpath_array_beta as $key => $value) { if(is_dir("$path/$value")){ // パス指定 $path_sub = "$path/$value"; // サブフォルダ内のファイル名取得 $array_beta = array_diff(scandir($path_sub), ['.', '..']); // パスとして取得(元配列に追加) foreach ($array_beta as $key2 => $value2) { array_push($fpath_array,"$path2/$value/$value2"); } }else{ // ファイルの場合はそのまま追加 array_push($fpath_array,"$path2/$value"); } } // print ""; var_dump($fpath_array); print ""; //Zip追加処理 foreach ($fpath_array as $filepath) { $zip->addFile($filepath); } $zip->close(); // ストリームに出力 header('Content-Type: application/zip; name="' . $zipFileName . '"'); header('Content-Disposition: attachment; filename="' . $zipFileName . '"'); header('Content-Length: '.filesize($zipTmpDir.$zipFileName)); echo file_get_contents($zipTmpDir.$zipFileName); // 一時ファイルを削除しておく unlink($zipTmpDir.$zipFileName); ```