用usort排序多维数组的表示法

时间:2015-05-17 04:07:06

标签: php arrays sorting usort

我希望首先按$json_a然后按match_formatted_date对以下数组match_localteam_name(从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']但没有快乐。

2 个答案:

答案 0 :(得分:2)

您应该将日期转换为时间戳并比较那些而不是原始字符串。

替换它:

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

答案 1 :(得分:1)

您正在尝试通过首先比较日期来对条目进行排序。但是,如果您的日期格式为16.05.2015,则使用strnatcmp(),您将始终按月份排序,然后逐月排序,最后按年份排序,这实际上没有任何意义。更糟糕的是,您还会在其中混合使用格式为May 16的日期,这与第一种格式相比更糟糕。

在比较它们之前,您必须将日期转换为Ymd等常用格式,例如20150516以便进行正确的比较。你还必须决定如何照顾May 16,你甚至没有约会 - 如果它在2016年5月15日之前或之后出现?