2013-08-02 2 views
1

Я читаю многомерный массив от JSON. Затем мне нужно сортировать по двум параметрам, примерно на 3 уровня в массиве.Сортировка многомерного массива в PHP с несколькими критериями

Я пробовал array_multisort, но мог выполнять только один уровень за раз. Затем я переехал в usort, основываясь на нескольких примерах, которые я видел здесь, на StackOverflow, но он упорно отказывается работать.

JSON:

[ 
    { 
    "multiple parameters": "foobar", 
     "projects": [ 
      { 
       "id": "00101", 
       "date": "9", 
       "time": "14:00", 
      "duration":"30" 
      }, 
      { 
       "id": "EX001", 
       "date": "8", 
       "time": "13:30", 
      "duration":"15" 
      }, 
      { 
       "id": "9A200", 
       "date": "10", 
       "time": "8:45", 
      "duration":"15" 
      }, 
      { 
       "id": "EQ002", 
       "date": "8", 
       "time": "9:30", 
      "duration":"15" 
      } 
     ] 
    } 
] 

PHP:

//read data from the json file 
$theschedule = '/directory/path/schedule.json'; 

//read json file 
if (file_exists ($theschedule)){ 
    $contents = utf8_encode(file_get_contents($theschedule)); 
    $Schedule= json_decode($contents, true); 

//Sort array 

usort($Schedule[0]['projects'], 'order_by_date_time'); 

function order_by_date_time($a, $b) 
{ 
    if ($a['date'] == $b['date']) 
    { 
    // date is the same, sort by time 
    if ($a['time'] == $b['time']) return 0; 
    return $a['time'] == 'y' ? -1 : 1; 
    } 

    // sort the date first: 
    return $a['date'] < $b['date'] ? 1 : -1; 
} 

Каждая встреча имеет дату и время - мне нужно отсортировать по дате, а затем время, чтобы заполнить страницу расписания встреч.

Я читал много, много сообщений stackoverflow. Наиболее полезны были Sort multidimensional array by multiple criteria

Sort an associative array in php with multiple condition (источник функции «order_by_date_time»)

Я прочитал PHP руководство по usort на http://www.php.net/manual/en/function.usort.php (и многие другие функции массива сортировки).

Я также подтвердил JSON с JSONLint, поэтому я не думаю, что это проблема, но если это может быть проблемой, я тоже могу ее изменить.

Я знаю, что связанные вопросы были подняты здесь раньше - я читал так много сообщений и пытался так много предложенных ответов. Однако в моем коде есть какая-то часть, которую я просто не вижу.

ответ

3

Это должно сработать для вас.

function order_by_date_time($a, $b){ 
     if ($a["date"] == $b["date"]){ 
      return strtotime($a["time"]) - strtotime($b["time"]); 
     } 
     return $a["date"] - $b["date"]; 
} 

usort ($Schedule[0]['projects'], "order_by_date_time"); 

See Working Fiddle

+0

Strtotime выглядел очень многообещающим, но он все еще ничего не разбирал. Совершенно недоумение. Я использую версию 5.3.3; не может думать о какой-либо причине, что usort будет просто .. не сортировать. – user2208757

+0

@ user2208757 Добавлена ​​ссылка, чтобы показать, что она работает. – Orangepill

+0

Я не знаю, какую магию имеет Скрипача, но она работает. ОНО РАБОТАЕТ!!!!! Очень счастлив. Очень смутно, поскольку я сравниваю два одинаковых набора кода, а один работает, а другой нет ... В конце концов, я найду разницу. Но тем временем, счастливый танец. :) СПАСИБО!! – user2208757

0

Как насчет переходов по всем встречам и добавления дополнительного поля date_time, которое является сортируемой комбинацией обоих полей. Тогда вам нужно будет только отсортировать его.

+0

OK. В качестве обходного пути это работает. Я все еще работаю над тем, как сделать остальную часть страницы работой с новой системой - когда я построил окончательный календарь, я использую цикл foreach для сортировки отсортированного массива и использую отдельное поле даты для создания новых заголовков. Однако это не является непреодолимым, хотя сейчас он работает. Благодаря! – user2208757

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