碳:比较diffForHumans

时间:2016-10-14 23:39:58

标签: laravel php-carbon dateinterval

我正在使用Laravel 5.3和Carbon库。

我正在尝试比较多个diffForHumans结果。

例如,我有三个不同之处:

3 weeks after

7 days after

2 days after

是否可以比较这些以找到最小值,最大值和平均值?

在这个例子中:

  • min:2天
  • 最长:3周
  • 平均:10天

如果有必要,我可以使用diff代替diffForHumans(在我看来,这将是获得平均值的精确结果)。

由于我无法找到关于此主题的任何内容,因此我对谷歌的评价有任何指示,所以我希望我在寻找错误的东西。

谢谢!

1 个答案:

答案 0 :(得分: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'),也可以翻译成另一种语言。所以你必须小心操纵它的输出。

注意:上面的代码只是精神上编译过的。