Carbon:比较 diffForHumans

问题描述 投票:0回答:1

我正在使用 Laravel 5.3 和 Carbon 库。

我正在尝试比较多个

diffForHumans
结果。

例如我有三个不同之处:

3 weeks after

7 days after

2 days after

是否可以比较它们来找到最小值、最大值和平均值?

在此示例中,将是:

  • 分钟:2天
  • 最长:3周
  • 平均:10天

如有必要,我可以使用

diff
代替
diffForHumans
(在我看来,这将获得精确的平均值结果)。

任何关于谷歌内容的指示都会受到赞赏,因为我找不到关于这个主题的任何内容,所以我希望我正在寻找错误的东西。

谢谢!

php laravel php-carbon dateinterval
1个回答
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'
),也可以翻译成另一种语言。所以你必须小心操作它的输出。

注意:上面的代码只是在心里编译过的。

© www.soinside.com 2019 - 2024. All rights reserved.