Сортировка многомерного массива более чем по одному полю

У меня есть следующие данные:

Array ( 
  [0] => Array ( 
         [filename] => def
         [filesize] => 4096 
         [filemtime] => 1264683091 
         [is_dir] => 1 
         [is_file] => 
  ) 
  [1] => Array ( 
         [filename] => abc
         [filesize] => 4096 
         [filemtime] => 1264683091 
         [is_dir] => 1 
         [is_file] => 
  ) 
  [2] => Array ( 
         [filename] => rabbit
         [filesize] => 4096 
         [filemtime] => 1264683060 
         [is_dir] => 0
         [is_file] => 
  )
  [3] => Array ( 
         [filename] => owl
         [filesize] => 4096 
         [filemtime] => 1264683022
         [is_dir] => 0
         [is_file] => 
  )
)

и я хотел бы отсортировать его более чем по одному значению. (например, по is_dir И по имени файла (в алфавитном порядке) или по времени файла И по имени файла и т. д.)

До сих пор я пробовал много решений, ни одно из которых не сработало.

Кто-нибудь знает лучший алгоритм/функцию/метод PHP для такой сортировки?


person Adam M-W    schedule 28.01.2010    source источник


Ответы (2)


Используйте usort и передайте в функцию собственную функцию сравнения.

//example comparison function
//this results in a list sorted first by is_dir and then by file name
function cmp($a, $b){
    //first check to see if is_dir is the same, which means we can
    //sort by another factor we defined (in this case, filename)
    if ( $a['is_dir'] == $b['is_dir'] ){
        //compares by filename
        return strcmp($a['filename'], $b['filename']);
    }
    //otherwise compare by is_dir, because they are not the same and
    //is_dir takes priority over filename
    return ($a['is_dir'] < $b['is_dir']) ? -1 : 1;   
}

Затем вы должны использовать usort следующим образом:

usort($myArray, "cmp");
//$myArray is now sorted
person Yacoby    schedule 28.01.2010
comment
благодарю вас. Я думал, что пробовал это раньше, но, очевидно, нет, так как это сработало. - person Adam M-W; 28.01.2010

array_multisort — это специальная функция для сортировки нескольких или многомерных массивов. Я когда-то им пользовался и мне нравится.

person Bakhtiyor    schedule 07.06.2010