現在の位置: ホーム> 最新記事一覧> FTP_RAWLISTは、ファイルリストを時間に並べ替える方法を実装しています

FTP_RAWLISTは、ファイルリストを時間に並べ替える方法を実装しています

gitbox 2025-05-26

1。FTP_RAWLIST関数の紹介

FTP_RAWLIST関数の関数は、指定されたディレクトリの詳細なファイル情報を取得することです。 Linux端子でLS -Lコマンドの実行に似ています。返される結果は文字列の配列であり、各要素は、許可、所有者、サイズ、時間などを含むファイルの詳細を表します。

 $ftp_conn = ftp_connect("gitbox.net");
ftp_login($ftp_conn, "username", "password");
$rawlist = ftp_rawlist($ftp_conn, "/path/to/directory");

取得した$ rawlistアレイは通常、次のようなものです。

 -rw-r--r-- 1 user group 1234 May 10 12:30 file1.txt
drwxr-xr-x 2 user group 4096 Apr 22 10:00 folder1
-rw-r--r-- 1 user group 5678 May 11 14:15 file2.log

2。時間情報を分析し、タイムスタンプを抽出します

時間ごとに順序付けを達成するには、各ファイル情報の時間部分を解析してタイムスタンプに変換する必要があります。 FTP_RAWLISTによって返される時間形式は、サーバーのオペレーティングシステムによって異なる場合がありますが、ほとんどの場合、上記の形式に似ています。

以下は、タイムスタンプを解析する機能を示します。

 function parseFtpRawlistTime($line) {
    // スペースごとにライン文字列を分割します,最多分割9一部,ファイル名のスペースを防ぎます
    $parts = preg_split('/\s+/', $line, 9);
    if (count($parts) < 9) {
        return false; // フォーマットが間違っています,解析できません
    }

    // 時間情報は通常にあります6、7、8少し,例えば:May 10 12:30 または May 10 2024
    $month = $parts[5];
    $day = $parts[6];
    $timeOrYear = $parts[7];

    // 今年を取得します,デフォルト年として
    $currentYear = date('Y');

    // 時間形式が時間であることを決定します:毎分または年
    if (strpos($timeOrYear, ':') !== false) {
        // 時間形式,今年をスプライスする必要があります
        $datetimeStr = "$month $day $currentYear $timeOrYear";
        $timestamp = strtotime($datetimeStr);
        // 時間が現在の時刻を超える場合(大晦日),昨年に調整されました
        if ($timestamp > time()) {
            $timestamp = strtotime("$month $day " . ($currentYear - 1) . " $timeOrYear");
        }
    } else {
        // 年間形式です,直接変換
        $datetimeStr = "$month $day $timeOrYear";
        $timestamp = strtotime($datetimeStr);
    }

    return $timestamp ?: false;
}

3.ファイルリストを時間単位で並べ替えます

タイムスタンプを使用すると、ファイルリスト全体をPHPのUSORT関数と組み合わせてソートできます。例は次のとおりです。

 // 仮定 $rawlist はい ftp_rawlist 返された配列
usort($rawlist, function($a, $b) {
    $timeA = parseFtpRawlistTime($a);
    $timeB = parseFtpRawlistTime($b);

    if ($timeA == $timeB) return 0;
    return ($timeA < $timeB) ? -1 : 1;
});

このようにして、 $ rawlistは昇順でソートされます。降順でソートする場合は、比較シンボルを逆にしてください。

4。サンプルコードを完了します

解析時間の以前の関数を組み合わせると、以下は時間ごとにソートされたFTPファイルの完全なリストの例です。

 <?php
$ftp_server = "gitbox.net";
$ftp_user = "username";
$ftp_pass = "password";

$conn = ftp_connect($ftp_server);
if (!$conn) {
    die("接続できません FTP サーバ");
}

if (!ftp_login($conn, $ftp_user, $ftp_pass)) {
    ftp_close($conn);
    die("FTP ログインに失敗しました");
}

$path = "/path/to/directory";
$rawlist = ftp_rawlist($conn, $path);
ftp_close($conn);

function parseFtpRawlistTime($line) {
    $parts = preg_split('/\s+/', $line, 9);
    if (count($parts) < 9) {
        return false;
    }

    $month = $parts[5];
    $day = $parts[6];
    $timeOrYear = $parts[7];
    $currentYear = date('Y');

    if (strpos($timeOrYear, ':') !== false) {
        $datetimeStr = "$month $day $currentYear $timeOrYear";
        $timestamp = strtotime($datetimeStr);
        if ($timestamp > time()) {
            $timestamp = strtotime("$month $day " . ($currentYear - 1) . " $timeOrYear");
        }
    } else {
        $datetimeStr = "$month $day $timeOrYear";
        $timestamp = strtotime($datetimeStr);
    }

    return $timestamp ?: false;
}

usort($rawlist, function($a, $b) {
    $timeA = parseFtpRawlistTime($a);
    $timeB = parseFtpRawlistTime($b);
    if ($timeA == $timeB) return 0;
    return ($timeA < $timeB) ? -1 : 1;
});

// ソートされたファイルリストを出力します
foreach ($rawlist as $line) {
    echo $line . "\n";
}