1

配列内にたくさんのファイルがあります

im(month)(day)(year)

im01012007

im01022006

im01022012

im01032011

im01042010

im01042012

im01052009

im01052011

im01062012

im01072008

im01072011

等..

年、月、日で並べ替えられるように配列を並べ替える方法はありますか?

4

5 に答える 5

1

使ってみてくださいusort

$string = "im01012007.jpg,im01022006.jpg,im01022012.jpg,im01032011.jpg,im01042010.jpg,im01042012.jpg,im01052009.jpg,im01052011.jpg,im01062012.jpg,im01072008.jpg,im01072011.jpg";
$array = explode(",", $string); // rebulding your array ;

var_dump($array);

usort($array, function ($a, $b) {
    $a = DateTime::createFromFormat("mdY", substr(pathinfo($a, PATHINFO_FILENAME), 2));
    $b = DateTime::createFromFormat("mdY", substr(pathinfo($b, PATHINFO_FILENAME), 2));
    return ($a == $b) ? 0 : (($a < $b) ? - 1 : 1);
});

var_dump($array);

出力

array
  0 => string 'im01012007.jpg' (length=14)
  1 => string 'im01022006.jpg' (length=14)
  2 => string 'im01022012.jpg' (length=14)
  3 => string 'im01032011.jpg' (length=14)
  4 => string 'im01042010.jpg' (length=14)
  5 => string 'im01042012.jpg' (length=14)
  6 => string 'im01052009.jpg' (length=14)
  7 => string 'im01052011.jpg' (length=14)
  8 => string 'im01062012.jpg' (length=14)
  9 => string 'im01072008.jpg' (length=14)
  10 => string 'im01072011.jpg' (length=14)

array
  0 => string 'im01022006.jpg' (length=14)
  1 => string 'im01012007.jpg' (length=14)
  2 => string 'im01072008.jpg' (length=14)
  3 => string 'im01052009.jpg' (length=14)
  4 => string 'im01042010.jpg' (length=14)
  5 => string 'im01032011.jpg' (length=14)
  6 => string 'im01052011.jpg' (length=14)
  7 => string 'im01072011.jpg' (length=14)
  8 => string 'im01022012.jpg' (length=14)
  9 => string 'im01042012.jpg' (length=14)
  10 => string 'im01062012.jpg' (length=14)
于 2012-10-08T16:00:54.520 に答える
1

はいあります。最初にそれを賢明なフォーマットに変換してください。

PHPのDateTimeクラスを使用し、PHPプログラムを使用している間は、すべての日付をDateTimeオブジェクトとして保持することをお勧めします。

それをしたくない場合は、これらをそのまま並べ替える関数を次に示します。

usort($myDates, function($a, $b) {
    $aBits = array_chunk($a,2);
    $bBits = array_chunk($a,2);
    $aDate = $aBits[3].$aBits[4].$aBits[2].$aBits[1];
    $bDate = $aBits[3].$aBits[4].$aBits[2].$aBits[1];
    return ($aDate < $bDate) ? -1 : 1;
});

お役に立てば幸いです。

于 2012-10-08T15:53:38.663 に答える
1

文字列を使用substr()して、parte(日、月、年)に分割します。次に、それらを並べ替えることができます。

于 2012-10-08T15:53:38.673 に答える
1

組み込み関数は箱から出してこれを行うことはありません、私は次のようにusortを使用します:

usort($files, function($a, $b) {
    return strcmp(preg_replace('/^.*(\d{2})(\d{2})(\d{4})$/', '$3$1$2', $a), preg_replace('/^.*(\d{2})(\d{2})(\d{4})$/', '$3$1$2', $b));
});
于 2012-10-08T15:54:14.133 に答える
1

これにより、古いものから新しいものへと並べ替えられます。krsort新しいものから古いものへの並べ替えに使用します。

$files = array();
if ($handle = opendir('/path/to/files')) {
    while (false !== ($entry = readdir($handle))) {
        if ($entry != "." && $entry != "..") {
            $y = substr($entry, 6, 4);
            $m = substr($entry, 2, 2);
            $d = substr($entry, 4, 2);
            $files[$y . $m . $d] = $entry;
        }
    }
    closedir($handle);
}
ksort($files);

私はこれらのPHPマニュアルエントリを使用してこのソリューションを作成しました。

于 2012-10-08T15:55:25.463 に答える