使用 usort 对多维数组进行排序的表示法
Notation for sorting multidimensional array with usort
我希望先按 match_formatted_date
然后按 match_localteam_name
对以下数组 $json_a
(从 json 文件解码)进行排序。
array(4) {
["APIRequestsRemaining"]=> int(920)
["matches"]=> array(3) {
[0]=> array(3) {
["match_id"]=> string(7) "1999477"
["match_formatted_date"]=> string(6) "16.05.2015"
["match_localteam_name"]=> string(7) "Burnley" }
[1]=> array(3) {
["match_id"]=> string(7) "1999478"
["match_formatted_date"]=> string(10) "16.05.2015"
["match_localteam_name"]=> string(3) "QPR"
}
[2]=> array(3) {
["match_id"]=> string(7) "1999479"
["match_formatted_date"]=> string(10) "16.05.2015"
["match_localteam_name"]=> string(7) "Arsenal"
}
}
["Action"]=> string(5) "today"
}
我试过调用一个函数来按如下方式进行排序:
function cmp($a, $b) {
// sort by ['match_formatted_date']
$retval = strnatcmp(substr($b['match_formatted_date'],0,10), substr($a['match_formatted_date'],0,10));
// if identical, sort by ['match_localteam_name']
if(!$retval) $retval = strnatcmp($a['match_localteam_name'], $b['match_localteam_name']);
return $retval;
}
$matches = $json_a['matches'];
usort($matches, 'cmp');
但是,它似乎没有对记录进行排序。我已经尽可能多地阅读了关于 usort 的内容,但我怀疑问题出在我函数中的符号格式上。我也试过 $a['matches']['match_date']
但没有快乐。
您正在尝试通过首先比较日期来对条目进行排序。但是,如果您的日期格式为 16.05.2015
,使用 strnatcmp()
,您将始终首先按月中的第几天排序,然后按月最后按年排序,这实际上没有任何意义。更糟糕的是,您还将日期与格式 May 16
混合在一起,这与第一种格式相比更加糟糕。
在比较它们之前,您必须将日期转换为通用格式,例如 Ymd
,例如20150516
以便进行正确的比较。你还必须决定如何处理 May 16
,你甚至都没有约会——应该在 2016 年 5 月 15 日之前还是之后?
您应该将日期转换为时间戳并比较它们而不是原始字符串。
替换为:
// sort by ['match_formatted_date']
$retval = strnatcmp(substr($b['match_formatted_date'],0,10), substr($a['match_formatted_date'],0,10));
有了这个:
// sort by ['match_formatted_date']
$retval =
strtotime($a['match_formatted_date'])
- strtotime($b['match_formatted_date']);
我希望先按 match_formatted_date
然后按 match_localteam_name
对以下数组 $json_a
(从 json 文件解码)进行排序。
array(4) {
["APIRequestsRemaining"]=> int(920)
["matches"]=> array(3) {
[0]=> array(3) {
["match_id"]=> string(7) "1999477"
["match_formatted_date"]=> string(6) "16.05.2015"
["match_localteam_name"]=> string(7) "Burnley" }
[1]=> array(3) {
["match_id"]=> string(7) "1999478"
["match_formatted_date"]=> string(10) "16.05.2015"
["match_localteam_name"]=> string(3) "QPR"
}
[2]=> array(3) {
["match_id"]=> string(7) "1999479"
["match_formatted_date"]=> string(10) "16.05.2015"
["match_localteam_name"]=> string(7) "Arsenal"
}
}
["Action"]=> string(5) "today"
}
我试过调用一个函数来按如下方式进行排序:
function cmp($a, $b) {
// sort by ['match_formatted_date']
$retval = strnatcmp(substr($b['match_formatted_date'],0,10), substr($a['match_formatted_date'],0,10));
// if identical, sort by ['match_localteam_name']
if(!$retval) $retval = strnatcmp($a['match_localteam_name'], $b['match_localteam_name']);
return $retval;
}
$matches = $json_a['matches'];
usort($matches, 'cmp');
但是,它似乎没有对记录进行排序。我已经尽可能多地阅读了关于 usort 的内容,但我怀疑问题出在我函数中的符号格式上。我也试过 $a['matches']['match_date']
但没有快乐。
您正在尝试通过首先比较日期来对条目进行排序。但是,如果您的日期格式为 16.05.2015
,使用 strnatcmp()
,您将始终首先按月中的第几天排序,然后按月最后按年排序,这实际上没有任何意义。更糟糕的是,您还将日期与格式 May 16
混合在一起,这与第一种格式相比更加糟糕。
在比较它们之前,您必须将日期转换为通用格式,例如 Ymd
,例如20150516
以便进行正确的比较。你还必须决定如何处理 May 16
,你甚至都没有约会——应该在 2016 年 5 月 15 日之前还是之后?
您应该将日期转换为时间戳并比较它们而不是原始字符串。
替换为:
// sort by ['match_formatted_date']
$retval = strnatcmp(substr($b['match_formatted_date'],0,10), substr($a['match_formatted_date'],0,10));
有了这个:
// sort by ['match_formatted_date']
$retval =
strtotime($a['match_formatted_date'])
- strtotime($b['match_formatted_date']);