0

次のファイルを含むディレクトリがあり、日付 (月、日、年) で名前が付けられているとします。

030313.pdf 030513.pdf 040113.pdf 052013.pdf

私は、explode() を使用してファイル名を壊すことができることを知っています。また、次のような多次元配列に何らかの方法でデータを保存する必要があると想定しています。

$files = array
(
array("030313.pdf", 03,03,13),
array("030513.pdf", 03,05,13),
array("040113.pdf", 04,01,13),
array("052013.pdf", 05,20,13)
);

その情報を月ごとにグループ化し、日ごとに並べ替えて、リンクの箇条書きリストとしてエコーアウトすることは可能ですか?

何かのようなもの:

2013 年 3 月:

  • 2013/03/03 (実際のファイルにリンク)
  • 2013/03/05 (実際のファイルにリンク)

2013年4月:

  • 2013/04/01 (実際のファイルにリンク)

2013年5月:

  • 2013/05/20 (実際のファイルにリンク)

これが可能である場合、たとえば 100 ~ 1000 個のファイルがあったとします。このページをロードすると、サーバーのパフォーマンスの問題が発生しますか?

ありがとう

ブレット

4

2 に答える 2

1

解決策は非常に簡単です。

$files = array
(
    array("030313.pdf", 03,03,13),
    array("030513.pdf", 03,05,13),
    array("040113.pdf", 04,01,13),
    array("052013.pdf", 05,20,13)
);

$sortedData = array();

foreach ($files as $file) {
    $dt = mktime(0, 0, 0,  $file[1], 1, 2000);
    $key = date('F', $dt) . ' ' . $file[3];
    if (array_key_exists($key, $sortedData)) {
        $sortedData[$key] []= $file;
    } else {
        $sortedData[$key] = array($file);
    }
}


function sortFunc($a, $b) {
    if ($a[2] > $b[2]) {
        return 1;
    } else if ($a[2] < $b[2]) {
        return -1;
    } 
    return 0;
}

foreach ($sortedData as &$sd) {
    usort($sd, sortFunc);
}


foreach ($sortedData as $key => $data) {
    echo "<h1>".$key."</h1>\n";
    foreach ($data as $d) {
        echo $d[0]."\n";
    }
}

出力を再フォーマットするだけです。

パフォーマンスは、サーバーで使用されるファイルシステムに大きく依存します。通常、1000 個の要素の配列を再フォーマットすることは何もありません。

于 2013-03-29T15:55:29.027 に答える
1

ほら、注文するように更新しました(最初にあなたの投稿を読んだとき、これを見逃していました.)

<?php

$files = array
(
    array("030313.pdf", 03,03,13),
    array("030513.pdf", 03,05,13),
    array("040113.pdf", 04,01,13),
    array("052013.pdf", 05,20,13)
);

$newArray = array();


foreach($files AS $file => $val){
        $newArray[$date = date('Ym', strtotime($val[1] . '/' . $val[2] . '/' . $val[3]))][] = $val[0];  
}

ksort($newArray);

$list = '<ul>';
foreach($newArray AS $key => $val){

    $list .= '<li>' . date('F Y', strtotime('01-' . substr($key, 4, 2) . '-' . substr($key, 0, 4)));

    if(is_array($val)){
        $list .= '<ul>';
        foreach($val AS $file => $filename){

            $list .= '<li><a href="' . $filename . '">Download ' . $filename . '</a></li>';

        }
        $list .= '</ul>';
    }
    $list .= '</li>';

}

$list .= '</ul>';

echo $list;

?>
于 2013-03-29T16:24:02.550 に答える