0

を使用して、連想配列の日付プロパティ (UNIX タイムスタンプ) を並べ替えていますusort()。意図したとおりに動作しています。しかし、機能を少し拡張したいと思います(可能であれば)。>「今」であるすべての日付は、逆の順序にする必要があります。つまり、「今」に最も近い日付をリストの一番上に表示したいのです。何か詳しく説明する必要がある場合はお知らせください。私の現在のコード:

usort($DTO, function($a, $b) {
     return $b['date'] - $a['date'];
});
4

1 に答える 1

4

PHP 5.3 以降を使用していることに感謝します。ファーストクラスの無名関数なしでこれを行うのは大変なことでした。

並べ替えは次のようになります。変数がどのように機能するかを示すために、変数をいくつかのサンプル データに置き換えました。

あなたのリクエストは 2 つの方法で解釈できます。両方の例を示します。

$fake_dates = array( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 );
$current_date = 5;
$picky_date_sort = function($a, $b) use($current_date) { 
    if($a > $current_date && $b <= $current_date)
        return -1;
    if($b > $current_date && $a <= $current_date)
        return 1;
    if($a > $current_date || $b > $current_date)
        return $a - $b;
    return $b - $a; 
};
usort($fake_dates, $picky_date_sort);
print_r($fake_dates);

テスト結果は次のとおりです。

Array
(
    [0] => 6
    [1] => 7
    [2] => 8
    [3] => 9
    [4] => 5
    [5] => 4
    [6] => 3
    [7] => 2
    [8] => 1
    [9] => 0
)

「今」より後の日付が一番上に表示されます。それらは昇順でソートされます。つまり、リストの下に行くほど、未来に進みます。リストのそのセクションが完了し、過去に再びヒットすると、降順の並べ替えが返され、新しい日付が低い日付よりも高くなります。

ただし、「過去と未来を分けても構わないので、現在に最も近いものを一番上に置きたい」と解釈することもできます。その方が簡単です。abs数値間の絶対差を取得するためにブレイクアウトします。

$absolute_diff_sort = function($a, $b) use($current_date) {
    $abs_b = abs($b - $current_date);
    $abs_a = abs($a - $current_date);
    return $abs_a - $abs_b;
};
usort($fake_dates, $absolute_diff_sort); print_r($fake_dates);

結果は

Array
(
    [0] => 5
    [1] => 6
    [2] => 4
    [3] => 7
    [4] => 3
    [5] => 8
    [6] => 2
    [7] => 1
    [8] => 9
    [9] => 0
)

現在(5)がトップです。リストの下に行くほど、現在と当時の絶対差が大きくなり、過去の日付と未来の日付が混在しています。

これらの解釈のどちらも意図したものではない場合は、質問を明確にする必要があります。

于 2012-12-09T18:05:01.470 に答える