2016-10-14 5 views
1

Я использую Laravel 5.3 и Carbon library.Углерод: сравнить diffForHumans

Я пытаюсь сравнить несколько результатов diffForHumans.

Например, у меня есть три отличия:

3 weeks after

7 days after

2 days after

Можно ли сравнить их найти минимальное, максимальное и среднее значение?

В этом примере, который был бы:

  • мин: 2 дня
  • Макс: 3 недели
  • средн: 10 дней

я мог бы использовать 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, вы можете ввести от модификатора и числового значения. После того, как приказано, вы можете сдвигать мин и поп макс:

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

Имейте в виду, что diffForHumans выход может быть короткая форма (например, 'd' вместо 'day'), а также перевод на другой язык. Поэтому вам нужно быть осторожным, манипулируя его выходом.

Примечание: код выше был только скомпилирован.

+0

Итак, используйте 'diffInSeconds' и сравните их (целые числа, я полагаю)? Так просто, и я не вижу практического недостатка, потрясающего. Вы не поверили бы обходным решениям, которые я пытался реализовать ... Я попробую это завтра, но это, вероятно, должно работать так, спасибо! И один риторический вопрос: почему это не похоже на то, что было реализовано в Carbon? – dbr

+0

Я думаю, что Углерода не хватает этой способности, потому что Carbon, в сущности, относится к * экземпляру времени *, тогда как операции, которые вы хотите, касаются * коллекции экземпляров времени *. – bishop