こんにちは。
PHPでの質問になります。

ディレクトリをまるごとZipで圧縮してダウンロードさせる仕組みを作りたいです。

リンクをクリックすることでZipで圧縮されたフォルダをダウンロードさせいたいのですが、
いくつかのサイトを参考にさせてもらったにも関わらず理解することが出来ませんでした。

現在は、中身がファイルのみであれば、Zipで圧縮してダウンロードさせることは可能です。

ディレクトリは以下のような構成のものを圧縮したいです。

test.zip
 |-images
   |-image1.jpg
   |-image2.jpg
 |-file1.php
 |-file2.php

複数ファイルの入ったフォルダと、ファイルが複数枚といった構成です。

ディレクトリを階層ごと圧縮するには再帰的な処理が必要とのことなのですが、
いまいち理解ができていません。

プログラムの流れ的には、

1.圧縮するディレクトリのパスを指定
2.保存する場所のパスを指定
3.ディクトリ内の一覧を取得
4.ファイルであればそのままストリームへ追加、フォルダであればフォルダを作成

といった感じでは無いかと想像はしています。

ですがどうやってコードを書けばよいのか、
またそもそも考え方が正しいのかどうかも分かりません。

いくつかのサイトを参考に拝見させていただきましたが、理解することができませんでした。

参考までに、自分の使っている
中身がファイルのみでのZipで圧縮するプログラムを載せておきます。

下記のコードでは、
・ファイル名を直接コードに書かないといけない
・フォルダを指定することが出来ない

といった問題点があります。

ご回答の方よろしくお願いします。

<?php
//Zipクラスロード
$zip = new ZipArchive();

//Zipファイル名指定
$zipFileName = 'test.zip';

//Zipファイル一時保存ディレクトリ取得
$zipTmpDir = '/phpdocs/filelesson';

//Zipファイルオープン
$result = $zip->open($zipTmpDir.$zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);

if ($result !== true) {
    return false;
}

//処理制限時間を外す
set_time_limit(0);

//パス
$fpath_array = array('images/asn.jpg','images/asn2.jpg','images/shirika.jpg');

//Zip追加処理
foreach ($fpath_array as $filepath) {
    //filename取得
    $filename = basename($filepath);

    //取得ファイルをZipに追加
    $zip->addFromString($filename,file_get_contents($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);
exit();