关于按时间排序数组的问题

时间:2012-01-03 16:09:40

标签: php sorting multidimensional-array

--- array $ points ----

Array
    (
        [0] => Array
            (
                [0] => 2011-10-02 05:30:00
                [1] => 20
            )

        [1] => Array
            (
                [0] => 2011-10-04 09:30:00
                [1] => 12
            )

        [2] => Array
            (
                [0] => 2011-10-01 13:30:00
                [1] => 25
            )

        [3] => Array
            (
                [0] => 2011-10-03 02:30:00
                [1] => 31
            )

    )

我上面有一个数组,想按时间对这个数组进行排序。然后我使用下面的代码进行排序,结果是正确的。但是,如果我将代码time[$key] = $val[0]更改为$time = $val[0],则结果是错误的。

有人可以向我解释这个吗?非常感谢!

foreach($points as $key=>$val){

        $time[$key] = $val[0];

        array_multisort($time, SORT_ASC, $points);
    }

3 个答案:

答案 0 :(得分:9)

array_multisort一次排序多个数组。但是,它适用于列数组,因此需要foreach循环来获取时间列。构建此列表后,您可以执行多重排序。 $points数组根据$times中的索引按this example in the docs排序。

但是,您不需要在foreach内执行排序,因为这意味着排序发生了4次(在您的示例中)。它只需要发生一次:

foreach ($points as $key => $val) {
    $time[$key] = $val[0];
}

array_multisort($time, SORT_ASC, $points);

答案 1 :(得分:4)

函数uasort()采用比较回调函数。您可以使用它来比较两个时间戳。

$arr = array(
        array('2011-10-02 05:30:00','20'),
        array('2011-10-04 09:30:00','12'),
        array('2011-10-01 13:30:00','25'),
        array('2011-10-03 02:30:00','31')
);

function timecomp($a,$b)
{
    // Subtracting the UNIX timestamps from each other.
    // Returns a negative number if $b is a date before $a,
    // otherwise positive.
    return strtotime($b[0])-strtotime($a[0]);
}
uasort($arr,'timecomp');

print_r($arr);

上面的代码将返回

(
    [1] => Array
        (
            [0] => 2011-10-04 09:30:00
            [1] => 12
        )

    [3] => Array
        (
            [0] => 2011-10-03 02:30:00
            [1] => 31
        )

    [0] => Array
        (
            [0] => 2011-10-02 05:30:00
            [1] => 20
        )

    [2] => Array
        (
            [0] => 2011-10-01 13:30:00
            [1] => 25
        )

)

答案 2 :(得分:-2)

你想做的是(基本想法):

foreach($points as $key=>$val){
     $time[$val[1]] = $val[0]; // $time will be an array of [ point => time ] pairs
}
asort( $time ); // sorts the array and maintains indexes

在此之后,您有一组point => time对,按时间排序。要获得积分,例如做

$points = array_keys( $time );