Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP数组按值和日期排序(2列)_Php_Arrays_Sorting - Fatal编程技术网

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

PHP数组按值和日期排序(2列),php,arrays,sorting,Php,Arrays,Sorting,我有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' =&g

我有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')
);
我的问题是如何按标题和日期时间排序?我花了相当长的时间搜索这个。但我刚刚发现sort by两列,但数据类型相同。我现在很难做到这一点,因为我相信我的函数涉及strotime()函数,因为这涉及时间

这就是我现在所拥有的

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');

有谁能帮助我实现这一点吗?

看起来您需要阵列多端口。有关更多信息,请访问以下链接


基本思想将从上面链接的示例2中清除。

第二个
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,sortbytletleanddatetime)

试试这个

$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');

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

现在的输出是什么?另一件事:不可能按两个参数排序。如果先按标题排序,然后按日期时间排序,结果与只按日期时间排序没有什么不同。@MarkGabriel我曾尝试使用
array\u multisort()
,但最后只按标题正确排序,而不是按日期时间排序。我发现了一些解决方案,即使是这样,也可以按多个参数排序。只是我的参数涉及日期时间格式,所以这对我来说有点棘手。根据这段代码,数组根据标题排序,然后根据日期时间排序。因此,第一次排序是无用的。您得到的输出是一个数组,该数组根据日期时间进行排序。