【问题标题】:Sorting an array using PHP's usort method使用 PHP 的 usort 方法对数组进行排序
【发布时间】:2015-10-12 16:01:50
【问题描述】:

也许我想要的是'太'自定义并且必须手动完成,我认为usort 可以做到但似乎我不完全理解它。按日期降序对节目数组进行排序,但如果日期是当前年份,则将它们放在数组的开头:

    usort($show, function($a, $b){
        $year = (int) date("Y", time());

        $a = $a['date'];
        $b = $b['date'];

        if ($a === $year) return -1;
        if ($b === $year) return -1;

        if ($a === $b) return 0;
        return ($a > $b) ? -1 : 1;
    });

【问题讨论】:

  • 这样不行。 usort(与任何其他用户定义的比较函数一样)声明元素将被比较的严格顺序。解决办法可能是——分两步排序,第一:按日期排序元素(按"year"排序),第二:把当年元素放在开头(按"year == current year"排序)

标签: php usort


【解决方案1】:

如果$a 是当前年份而$b 不是当前年份,则将$a 放在首位。
如果$a 不是当前年份而$b 是当前年份,则将$b 放在首位。
否则只需对$a$b 进行简单的比较/排序:

$array = array(
    1890,
    1725,
    2000,
    2004,
    2015,
    2016,
    2050,
    2156,
    2019,
);

usort($array, function ($a, $b) {
    $y= date('Y');

    if ($a == $y && $b != $y) {
        return -1;
    } elseif ($a != $y && $b == $y) {
        return 1;
    }

    return $b - $a;
});

var_dump($array);

// output

Array
(
    [0] => 2015
    [1] => 2156
    [2] => 2050
    [3] => 2019
    [4] => 2016
    [5] => 2004
    [6] => 2000
    [7] => 1890
    [8] => 1725
)

LIVE

【讨论】: