我正在使用Laravel 5.3和Carbon库。
我正在尝试比较多个diffForHumans
结果。
例如,我有三个不同之处:
3 weeks after
7 days after
2 days after
是否可以比较这些以找到最小值,最大值和平均值?
在这个例子中:
如果有必要,我可以使用diff
代替diffForHumans
(在我看来,这将是获得平均值的精确结果)。
由于我无法找到关于此主题的任何内容,因此我对谷歌的评价有任何指示,所以我希望我在寻找错误的东西。
谢谢!
答案 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'
),也可以翻译成另一种语言。所以你必须小心操纵它的输出。
注意:上面的代码只是精神上编译过的。