PHP数组按值和日期排序(2列)


PHP array sort by value and date (2 columns)

我在PHP多维数组。比如

$mylist = array(
    array('ID' => 1, 'title' => 'Hello', 'datetime' => '2014-05-05 12:08 PM'),
    array('ID' => 2, 'title' => 'Amazing Pic', 'datetime' => '2014-05-06 11:08 PM'),
    array('ID' => 3, 'title' => 'Style', 'datetime' => '2014-05-02 9:08 PM'),
    array('ID' => 4, 'title' => 'Hello World', 'datetime' => '2014-05-01 5:08 PM')
);

我的问题是我如何排序标题和日期时间?我花了不少时间来研究这个问题。但我只是找到了两列排序,但数据类型相同。我现在正在努力做到这一点,因为我相信我的涉及strtotime()函数,因为它涉及时间。

这是我现在拥有的

function querySort ($x, $y) {
    return strcasecmp($x['title'], $y['title']);
}
function cmp($a, $b){
    $ad = strtotime($a['datetime']);
    $bd = strtotime($b['datetime']);
    return ($ad-$bd);
}
usort($mylist , 'querySort');
usort($mylist , 'cmp');

谁能告诉我如何实现这一点?

第二个usort覆盖第一个usort的输出。

你需要做的是合并两个排序函数,按标题和日期时间排序。

伪代码将是:

function SortByTitleAndDateTime($a,$b)
    1) SortByTitle and return the value if it is non zero.
    2) If SortByTitle is zero (meaning the 2 values are the same in terms of title), 
        do SortByDateTime

最后,您只需要调用usort(array, SortByTitleAndDateTime)

看起来您需要array_multisort。您可以访问以下链接获取更多信息http://www.php.net//manual/en/function.array-multisort.php

试试这个,

$mylist = array(
    array('ID' => 1, 'title' => 'Hello', 'datetime' => '2014-05-05 12:08 PM'),
    array('ID' => 2, 'title' => 'Amazing Pic', 'datetime' => '2014-05-06 11:08 PM'),
    array('ID' => 3, 'title' => 'Style', 'datetime' => '2014-05-02 9:08 PM'),
    array('ID' => 4, 'title' => 'Hello World', 'datetime' => '2014-05-01 5:08 PM'),
     array('ID' => 5, 'title' => 'Boy', 'datetime' => '2014-05-01 5:08 PM')
);

// Obtain a list of columns
foreach ($mylist as $key => $row) {
    $dTime[$key]  = $row['datetime'];
    $title[$key] = $row['title'];
}
// Sort the data with dTimedescending, titleascending
// Add $mylist as the last parameter, to sort by the common key
array_multisort($dTime, SORT_DESC, $title, SORT_ASC, $mylist);

你的输出将是

Array
(
    [0] => Array
        (
            [ID] => 2
            [title] => Amazing Pic
            [datetime] => 2014-05-06 11:08 PM
        )
    [1] => Array
        (
            [ID] => 1
            [title] => Hello
            [datetime] => 2014-05-05 12:08 PM
        )
    [2] => Array
        (
            [ID] => 3
            [title] => Style
            [datetime] => 2014-05-02 9:08 PM
        )
    [3] => Array
        (
            [ID] => 5
            [title] => Boy
            [datetime] => 2014-05-01 5:08 PM
        )
    [4] => Array
        (
            [ID] => 4
            [title] => Hello World
            [datetime] => 2014-05-01 5:08 PM
        )
)

为了演示,我添加了ID no 5,因此日期按降序排序,标题按升序排序

我最终得到了类似Mark Gabriel的逻辑。这将首先整理标题,然后是日期时间。这里是:

function SortByTitleAndDateTime($a,$b){
    if ( strcasecmp($a['title'], $b['title']) != 0 ){
        return strcasecmp($a['title'], $b['title']);
    }
    else{
        $ad = strtotime($a['datetime']);
        $bd = strtotime($b['datetime']);
        return ($ad-$bd);
    }
}
usort($mylist, 'SortByTitleAndDateTime');

希望这对其他人也有帮助。