如何通过关键字找到最大和最小日期

4

我有一个数组

$a = array(
           "2010-05-03" =>100,
          "2010-05-04" =>400,   
           "2008-05-01" =>800,
          "2011-01-01" =>800
     ); 

如何通过 key(date) 查找最大值和最小值?

例如:

max => 2011-01-01
min => 2008-05-01

你在过去一周内上线了吗?你问题中表达的要求与你接受的答案不一致,这使得你的问题不清晰。请澄清这个非常老的问题,因为它会让研究人员感到困惑,并邀请行为根本不同的答案。 - mickmackusa
5个回答

8

我会有些懒惰,只让PHP两次查找数组。第一次查找最小值,第二次查找该值的第一个匹配键:

$min_key = array_search(min($a), $a);

或者为最大值:
$max_key = array_search(max($a), $a);

max()min()返回数组中的最大/最小值,而不是最大/最小键。 - Philippe Gerber
是的,这就是他们所做的。因此需要进行第二步。 - mario
2
啊,我太蠢了,以为 array_search() 会返回一个值,而不是一个键...但这毫无意义。抱歉! :-) - Philippe Gerber
你正在获取字符串的最大值和最小值,而不是日期时间对象! - Yehia
此页面上没有日期时间对象。然而,我发现所提出的问题和被接受的答案存在矛盾。 - mickmackusa

5

不确定您是需要最大值和最小值所对应的键,还是需要最大值和最小值本身。

以下代码返回最大值和最小值所对应的键:

$keys = array_keys($a);
$min = $a[min($keys));
$max = $a[max($keys));

在第二次阅读后,这可能是 OP 实际要求的内容。(查找最小/最大日期。) - mario

2
$maxK = $a[0];
$minK = $a[0];
foreach($a as $k => $v) {
    if($v > $a[$maxK]) $maxK = $v;
    if($v < $a[$minK]) $minK = $v;
}

这可能是你想要的。然后你可以像下面这样获取最小/最大键和值:

$maxKey = $maxK;
$maxValue = $a[$maxK];
$minKey = $minK;
$minValue = $a[$minK];

2

一种方法是通过array_keys从数组中提取键,然后通过natcasesort对键进行自然排序。

这样,您最终会得到:

<?php
    $testData = array(
        "2010-05-03" =>100,
        "2010-05-04" =>400,   
        "2008-05-01" =>800,
        "2011-01-01" =>800
    );

    natcasesort($testKeys = array_keys($testData));

    echo 'Min: ' . $testKeys[0] . ', max: ' . $testKeys[count($testKeys) - 1] . '<br />';
?>

注意:在PHP7.4及以下版本中,只有变量应该通过引用传递。从PHP8开始,“致命错误:未捕获的错误:natcasesort():参数#1($ array)不能通过引用传递”。为什么这个没有字母键的值数组需要“natcasesort()”?提示,它不需要。 - mickmackusa

1
asort($a);
$keys = array_keys($a);
$min = $keys[0];
$max = $keys[count($keys) - 1];

或者,简单地说

$min = array_search(min($a), $a);
$max = array_search(max($a), $a);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接