PHP数组按值和日期排序(2列)
我有PHP中的多维数组。差不多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
$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()
,但最后只按标题正确排序,而不是按日期时间排序。我发现了一些解决方案,即使是这样,也可以按多个参数排序。只是我的参数涉及日期时间格式,所以这对我来说有点棘手。根据这段代码,数组根据标题排序,然后根据日期时间排序。因此,第一次排序是无用的。您得到的输出是一个数组,该数组根据日期时间进行排序。