首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按日期对数组进行排序并维护索引关联

按日期对数组进行排序并维护索引关联
EN

Stack Overflow用户
提问于 2012-11-27 07:31:10
回答 3查看 248关注 0票数 0

在php中有没有一种方法可以让我按日期对数组进行排序并显示它们?类似于asort或usort?

问题是日期字段也可以包含像“未知”这样的值。我想按日期降序打印所有记录,并在末尾打印未知的记录。到目前为止,这是我的代码。

代码语言:javascript
复制
foreach ($MailPieceArr as $key => $val) {

    $count++;
    if (($count % 2) == 1) {
        print "<tr bgcolor='#CCCCCC'>";
    } else {
        print "<tr bgcolor=white>";
    }

    print "<td align=center>".$MailPieceArr[$key]["type"]."</td>";
    print "<td align=center>".$MailPieceArr[$key]["id"]."</td>";
    print "<td align=center>".$MailPieceArr[$key]["ddate"]."</td>";
    print "<td align=center>".$MailPieceArr[$key]["acode"]."</td>";

    print "</tr>";
}

下面是我的数组的样子:

代码语言:javascript
复制
print_r($MailPieceArr);

输出:

代码语言:javascript
复制
Array
(
    [0] => Array
        (
            [type] => First-Class
            [id] => 77770056
            [ddate] => 11/26/2012
            [acode] => 2643
        )

    [1] => Array
        (
            [type] => First-Class
            [id] => 77770057
            [ddate] => 11/26/2012
            [acode] => 2643
        )

    [2] => Array
        (
            [type] => First-Class
            [id] => 77770058
            [ddate] => 11/21/2012
            [acode] => 2641
        )

    [3] => Array
        (
            [type] => First-Class
            [id] => 77770059
            [ddate] => 11/21/2012
            [acode] => 2641
        )

    [4] => Array
        (
            [type] => First-Class
            [id] => 77770042
            [ddate] => 10/29/2012
            [acode] => 2623
        )

    [5] => Array
        (
            [type] => First-Class
            [id] => 77770041
            [ddate] => 10/29/2012
            [acode] => 2623
        )

    [6] => Array
        (
            [type] => RR
            [id] => 88880001
            [ddate] => 10/29/2012
            [acode] => 2621
        )

    [7] => Array
        (
            [type] => First-Class
            [id] => 77770043
            [ddate] => 10/17/2012
            [acode] => 2625
        )

    [8] => Array
        (
            [type] => First-Class
            [id] => 77770044
            [ddate] => 10/17/2012
            [acode] => 2625
        )

    [9] => Array
        (
            [type] => RR
            [id] => 88880005
            [ddate] => 10/17/2012
            [acode] => 2619
        )

    [10] => Array
        (
            [type] => IMB
            [id] => 0001101111111111110011111111111
            [ddate] => UNKNOWN   
            [acode] => 2643
        )

)
EN

回答 3

Stack Overflow用户

发布于 2012-11-27 07:43:20

在排序函数中使用strtotime,不仅可以更容易地比较时间戳,而且还可以在无效的日期格式上返回false。

代码语言:javascript
复制
function date_sort($a, $b)
{
    $t1 = strtotime($a['ddate']);
    $t2 = strtotime($b['ddate']);

    if($t1 == false || $t2 == false)
        return 1;

    return $t2 - $t1;
}    
usort($array, 'date_sort');

这可以帮助你生成像this example这样的东西。

票数 1
EN

Stack Overflow用户

发布于 2012-11-27 07:33:28

您可以将日期转换为unix时间戳,这样比较起来会更容易。

票数 0
EN

Stack Overflow用户

发布于 2012-11-27 07:43:52

使用usort()将允许您使用完全自定义的比较函数对数组进行排序:

代码语言:javascript
复制
<?php
date_default_timezone_set('UTC');

$array  = array(
    array(
        'type'  => 'First-Class',
        'id'    => 7770057,
        'ddate' => '2012/11/26',
        'acode' => 2643
    ),
    array(
        'type'  => 'First-Class',
        'id'    => 7770058,
        'ddate' => '2012/11/21',
        'acode' => 2643
    ),
    array(
        'type'  => 'First-Class',
        'id'    => 7770059,
        'ddate' => 'UNKNOWN',
        'acode' => 2643
    ),
    array(
        'type'  => 'First-Class',
        'id'    => 7770060,
        'ddate' => 'UNKNOWN',
        'acode' => 2643
    ),
    array(
        'type'  => 'First-Class',
        'id'    => 7770061,
        'ddate' => '2012/11/30',
        'acode' => 2643
    ),
);


echo 'Before:'.PHP_EOL;
foreach($array as $item){
    echo $item['id'].': '.$item['ddate'].PHP_EOL;
}

usort($array, function($a, $b){
    if($a['ddate'] == 'UNKNOWN'){
            // Place UNKNOWN at end
        return 1;
    }

    if($a['ddate'] == $b['ddate']){
            // Dates are the same
        return 0;
    }
    return (strtotime($a['ddate']) > strtotime($b['ddate'])) ? -1 : 1;
});

echo 'After:'.PHP_EOL;
foreach($array as $item){
    echo $item['id'].': '.$item['ddate'].PHP_EOL;
}

但是,您应该考虑使用PHP的DateTime class来存储date对象。使用字符串可能有歧义-例如,11/12/2012是12月11日还是11月12日?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13574985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档