3

Eggdropで生成されたIRCログを時系列で参照できるPHPスクリプトを使用しています。最初は、ディレクトリの内容を読み取り、ファイルの変更日に基づいてログ名を配列に挿入していました。ただし、最近サーバーを移動した後、ファイルの変更日が更新され、ナビゲーションが乱雑になりました。

ログファイル名の構造は次のようになります。

channel.log.dayMONTHyear.txt

例えば:

shrawberry.log.08Apr2011.txt

これは、人間が読める形式であるため、適切に注文するのが困難です。

月コードは常に3文字の長さであり、シーケンス内で予測可能な位置にあるため、非標準の日付コードを手動でUnixタイムスタンプに解析し、リストを反復処理して、そのタイムスタンプを持つ配列に各項目を追加してから、並べ替えることができます。その番号による配列。

しかし、それは過度に聞こえます。

私はお金を稼いでいますか、それとも私が提案したソリューションは理想的ですか?


Marc B.の助けを借りて、私は以下を実装しました。

function dateFromEggLog($string){
    $month = substr($string,-11,-8);
    $day = substr($string,-13,-11);
    $year = substr($string,-8,-4);

    for($i=1;$i<=12;$i++){
        if(strtolower(date("M", mktime(0, 0, 0, $i, 1, 0))) == strtolower($month)){
            $month = $i;
            break;
        }
    }

    return "$year-$month-$day";
}

function my_compare($a, $b) {
    $a_date = dateFromEggLog($a);
    $b_date = dateFromEggLog($b);
    if ($a_date == $b_date) {
        return 0;
    }
    $a = strtotime($a_date); // convert to PHP timestamp
    $b = strtotime($b_date); // convert to PHP timestamp

    return (($a < $b) ? -1 : 1);
}

これにより、配列をいじくり回すことなく、ログを正常に並べ替えることができます。

4

3 に答える 3

3

サンプルのファイル名が「lookslike」サンプルと一致しません。「txt」と日付文字列が逆になります。ただし、いずれの場合もusort()、ユーザー定義関数で比較を実行できるPHP関数を使用できます。

それは特に効率的ではないかもしれませんが、あなたはこのようなことをするでしょう:

function my_compare($a, $b) {
    $a_date = ... extract date field from filename in $a
    $b_date = ... extract date field from filename in $b
    if ($a_date == $b_date) {
        return 0;
    }
    $a = strtotime($a_date); // convert to PHP timestamp
    $b = strtotime($b_date); // convert to PHP timestamp

    return (($a < $b) ? -1 : 1);
}

usort($array_of_filenames, 'my_compare');
于 2011-04-20T15:06:36.003 に答える
0

以前にfilemtimeを使用しましたか?今すぐfilectimeを使ってみませんか?

于 2011-04-20T15:08:49.600 に答える
0

ソート関数で、文字列操作channel.log.dayMONTHyear.txtchannel.log.yyyymmdd.txt使用するように並べ替えてから、基本的な文字列比較を使用してみませんか?

<?php

/* Helper stuff */

$months = Array(
  "Jan" => "01", "Feb" => "02", "Mar" => "03",
  "Apr" => "04", "May" => "05", "Jun" => "06",
  "Jul" => "07", "Aug" => "08", "Sep" => "09",
  "Oct" => "10", "Nov" => "11", "Dec" => "12"
);

/* The hard work */

function convertLogFilename($file) {

   $pos = strpos($file, ".log.");
   if ($pos === FALSE)
      throw new Exception("Invalid log file format");

   $pos += strlen(".log.");

   $dd   = substr($file, $pos, 2);
   $mm   = substr($file, $pos + 2, 3);
   $yyyy = substr($file, $pos + 5, 4);

   return substr($file, 0, $pos) . "$yyyy${months[$mm]}$dd.txt";
}

function sort_func($a, $b) {
   return convertLogFilename($a) < convertLogFilename($b);
}


/* Your program */

$files = Array(
   "channel.log.18Apr2011.txt",
   "channel2.log.21Jan2002.txt"
);

usort($files, 'sort_func');
print_r($files);
?>

出力:

Array
(
    [0] => channel2.log.21Jan2002.txt
    [1] => channel.log.18Apr2011.txt
)

これは、ファイル名ごとに完全な日付表現を作成するよりも大幅に高速である必要があります。

于 2011-04-20T17:56:04.050 に答える