2016-10-14 10 views
1

저는 Laravel 5.3과 Carbon 라이브러리를 사용하고 있습니다.Carbon : compare diffForHumans

많은 diffForHumans 결과를 비교하려고합니다.

예를 들어

나는 세 가지 차이점이 있습니다

3 weeks after

7 days after

2 days after

는 최소, 최대 및 평균 값을 찾으려면 다음을 비교 할 수 있습니까? 것이 예에서

:

  • 분 : 2 일
  • 최대 : 주
  • 평균 : 필요하면 내가 diff 대신 diffForHumans을 사용할 수

십일 (그리고 평균적으로 정확한 결과를 얻으려고하는 것처럼 보입니다.)

이 주제에 대해 아무 것도 찾을 수 없기 때문에 Google에서 높이 평가할만한 정보가 있으므로 잘못된 정보를 찾고 있기를 바랍니다.

감사합니다.

답변

1

diffForHumans의 출력은 사람과 사람에게있어서 우리가 알고있는 것처럼 끔찍한 계산기입니다. 하지 마. 다음과 같이

\Carbon의 배열을 감안할 때, 당신은 당신의 값을 계산할 수있다 :

$carbons = [ ... ]; 
$diffs = array_map(function ($c) { return $c->diffInSeconds(); }, $carbons); 
$max = $carbons[array_search(max($diffs), $diffs)]; 
$min = $carbons[array_search(min($diffs), $diffs)]; 
$avg = array_sum($diffs)/count($diffs); 

당신이 주장하고 diffForHumans의 출력을 정렬 할 경우, 수정 및 숫자 값 오프 입력 할 수 있습니다. 일단 주문, 당신은 최대 최소를 이동하고 팝업 수 있습니다 diffForHumans 출력이 짧은 형식이 될 수 있다는 것을 염두에

function score($c) { 
    $scores = [ 1 => 'second', 'minute', 'hour', 'day', 'week', 'month', 'year' ]; 
    $diff = $c->diffForHumans(); 
    foreach ($scores as $multiplier => $word) { 
     if (false !== strpos($diff, $word)) { 
      return $multiplier * (int)$diff; 
     } 
    } 
    return (int)$diff; 
} 
usort(
    $carbons, 
    function ($a, $b) { return score($a) <=> score($b); } 
); 

베어 (예를 들어, 대신 'day''d')뿐만 아니라 다른 언어로 번역. 따라서 출력을 조심스럽게 조작해야합니다.

참고 : 위 코드는 정신적으로 만 컴파일되었습니다.

+0

그래서 근본적으로 diffInSeconds를 사용하여 비교해 봅니다 (정수)? 이렇게 간단하고 나는 실제적인 결함, 최고를 볼 수 없다. 당신은 구현하려고 시도한 해결 방법을 믿지 않을 것입니다 ... 나는 내일 시도 할 것이지만 아마도 감사해야 할 것입니다! 그리고 한 가지 수사학적인 질문 : 왜 이것과 비슷한 것이 Carbon으로 구현되지 않았습니까? – dbr

+0

나는 Carbon이 근본적으로 시간 *에 관한 것이기 때문에 Carbon에이 능력이 없다고 상상해보십시오. 반면에 원하는 작업은 시간의 인스턴스를 수집합니다 *. – bishop