2015-05-17 3 views
1

Я хочу отсортировать следующий массив $json_a (который был расшифрован из json-файла), сначала match_formatted_date, а затем match_localteam_name.Обозначение для сортировки многомерного массива с usort

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" 
     } 

Я попытался вызвать функцию usort следующим образом:

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

Вы должны повернуть свои даты в метку времени и сравнить их вместо необработанных строк.

Заменить это:

// 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

Отметьте как ответ, поскольку он оба отметил проблему и предложил предложение для улучшения. – MrDave

1

Вы пытаетесь отсортировать записи, сравнив даты. Однако, если ваши даты имеют формат 16.05.2015, используя strnatcmp(), вы всегда сначала сортируете по дате месяца, затем по месяцам и, наконец, по году, что на самом деле не имеет никакого смысла. Хуже того, вы также смешиваете дату с форматом May 16, который сравнивается еще хуже с первым форматом.

Прежде чем сравнивать их, вам необходимо преобразовать ваши даты в обычный формат, например Ymd, например. 20150516, чтобы обеспечить правильное сравнение. Вы также должны решить, как позаботиться о May 16, где у вас даже нет даты - должно ли оно прибыть до или после 15 мая 2016 года?

+0

16 мая была ошибка транскрипции, должна была 16.05.2015. Исправлены. – MrDave

+0

Пожалуйста, напишите 'var_dump' результирующего массива после' usort() ' – Timo

Смежные вопросы