вопросы по сортировке массива по времени в php - PullRequest
11 голосов
/ 03 января 2012

--- массив $ 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 ]

9 голосов
/ 03 января 2012

array_multisort сортирует более одного массива одновременно. Однако он работает с массивом столбцов, поэтому для получения столбца времени необходим цикл foreach. После создания этого списка вы можете выполнить мультисортировку. Массив $points упорядочен в соответствии с индексами в $times, согласно этому примеру в документах .

Однако вам не нужно выполнять сортировку внутри foreach, поскольку это означает, что сортировка происходит 4 раза (в вашем примере). Это должно произойти только один раз:

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

array_multisort($time, SORT_ASC, $points);
4 голосов
/ 03 января 2012

Функция 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
        )

)
0 голосов
/ 03 января 2012

То, что вы хотите сделать, это (базовая идея):

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 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...