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)がトップです。リストの下に行くほど、現在と当時の絶対差が大きくなり、過去の日付と未来の日付が混在しています。
これらの解釈のどちらも意図したものではない場合は、質問を明確にする必要があります。