2012-12-09 4 views
0

usort()을 사용하여 연관 배열 날짜 속성 (유닉스 타임 스탬프)을 정렬합니다. 그것은 의도적으로 작동합니다. 그러나 기능을 조금 확장하고 싶습니다 (가능한 경우). > "now"인 모든 날짜는 역순이어야합니다. 즉, "now"에 가장 가까운 날짜를 목록의 맨 위에 표시하려고합니다. 내가 무엇을 더 자세히 설명해야하는지 알려주세요. 현재 코드 :usort() - 날짜가> 오늘인 경우

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

답변

3

PHP 5.3 이상을 사용하고있어 일급 익명 기능없이이 작업을 수행하는 것이 고통 스럽습니다.

귀하의 정렬은 다음과 같아야합니다. 변수가 어떻게 작동하는지 보여주기 위해 변수를 몇 가지 샘플 데이터로 대체했습니다.

귀하의 요청을 두 가지 방식으로 해석 할 수 있습니다. 두 가지 모두에 대한 예제를 제공 할 것입니다. 에서

$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을 찾아 낼 것입니다.

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

$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); 

결과는하기 (5) 상단에있다. 목록을 아래로 내려 가면 과거와 미래의 날짜를 혼합하여 현재와 다음의 절대적인 차이가 커집니다.

이러한 해석이 의미하는 바가 없다면 질문을 명확히해야합니다.

+0

Omg! 무슨 대답이야! :) –

+0

나는 동의한다, 많이 고마워한다! – Johan

+0

첫 번째 옵션은 저에게 가장 오래된 날짜를 먼저주는 것처럼 보입니다. 왜 그런가요? – Johan

관련 문제