PHP 数组排序数字第一,字母排序最后



我有一个数组:

Array
(
    ...
    [14] => Array
        (
            [date] => 2014-04-14
            [period] => 6
        )
    [15] => Array
        (
            [date] => 2014-04-21
            [period] => R1
        )
    [16] => Array
        (
            [date] => 2014-04-21
            [period] => R2
        )
    [17] => Array
        (
            [date] => 2014-04-21
            [period] => 4
        )
    [18] => Array
        (
            [date] => 2014-04-21
            [period] => 8
        )
    [19] => Array
        (
            [date] => 2014-04-28
            [period] => 1
        )
     ...
)

它有两种类型的排序:日期和期间。但与此同时,"期间"项的排序是数字和字母。以 2014-04-21 为例:

    [15] => Array
        (
            [date] => 2014-04-21
            [period] => R1
        )
    [16] => Array
        (
            [date] => 2014-04-21
            [period] => R2
        )
    [17] => Array
        (
            [date] => 2014-04-21
            [period] => 4
        )
    [18] => Array
        (
            [date] => 2014-04-21
            [period] => 8
        )

是否可以按数字排序,然后按字母顺序排序?我需要类似的结果:

[15] => Array
    (
        [date] => 2014-04-21
        [period] => 4
    )
[16] => Array
    (
        [date] => 2014-04-21
        [period] => 8
    )
[17] => Array
    (
        [date] => 2014-04-21
        [period] => R1
    )
[18] => Array
    (
        [date] => 2014-04-21
        [period] => R2
    )

我使用此代码:

function cmp($a, $b) {
    if ($a['date'] == $b['date']) { 
        if(is_numeric($a['period']) && !is_numeric($b['period'])) {
            return 1;
        }     
        else if(!is_numeric($a['period']) && is_numeric($b['period'])) {
            return -1;
        }
        else {
            return ($a['period'] < $b['period']) ? -1 : 1;
        }       
    }
    return (strtotime($a['date']) < strtotime($b['date']))? -1 : 1;
}
usort($arr, "cmp");
您应该

在前两个条件下改变方向:

if(is_numeric($a['period']) && !is_numeric($b['period'])) {
  return -1;
}     
else if(!is_numeric($a['period']) && is_numeric($b['period'])) {
  return 1;
}

最新更新