<?php
// Relatively small array of various file types.
// I want to display the results of the files array in this order.
$sort_array = array ( 'mp4' , 'mpeg' , 'flv' , 'f4v' , 'avi' ) ; // This is the array I would like to sort on filetype. The data is coming from Amazon simple DB...
// and again a given media object will only have a small handful of files... in fact
// probably no more than two or three.
array ( 'title' => 'race day' , 'filetype' => 'f4v' , 'filename' => 'racing.f4v' ) , array ( 'title' => 'playin checkers' , 'filetype' => 'mp4' , 'filename' => 'checkers.mp4' ) , array ( 'title' => 'playin checkers' , 'filetype' => 'mp3' , 'filename' => 'checkers.mp3' ) , array ( 'title' => 'playin checkers' , 'filetype' => 'avi' , 'filename' => 'checkers.avi' ) , array ( 'title' => 'eating melons' , 'filetype' => 'mp4' , 'filename' => 'watermelon.mp4' ) , array ( 'title' => 'eating melons (audio)' , 'filetype' => 'mp3' , 'filename' => 'watermelon.mp3' ) ) ;
usort ( $files , make_comparer
( [ 'filetype' , SORT_ASC
, function ( $t ) use ( $weights ) { return $weights [ $t ] ; } ] ) ) ;
function make_comparer( ) {
// Normalize criteria up front so that the comparer finds everything tidy
foreach ( $criteria as $index => $criterion ) {
$criteria [ $index ] = is_array ( $criterion ) : array ( $criterion , SORT_ASC
, null ) ; }
return function ( $first , $second ) use ( & $criteria ) {
foreach ( $criteria as $criterion ) {
// How will we compare this round?
list ( $column , $sortOrder , $projection ) = $criterion ; $sortOrder = $sortOrder === SORT_DESC ? - 1 : 1 ;
// If a projection was defined project the values now
if ( $projection ) {
}
else {
$lhs = $first [ $column ] ;
$rhs = $second [ $column ] ;
}
// Do the actual comparison; do not return if equal
if ( $lhs < $rhs ) {
return - 1 * $sortOrder ;
}
else if ( $lhs > $rhs ) {
return 1 * $sortOrder ;
}
}
return 0 ; // tiebreakers exhausted, so $first == $second
} ;
}
PD9waHAKLy8gUmVsYXRpdmVseSBzbWFsbCBhcnJheSBvZiB2YXJpb3VzIGZpbGUgdHlwZXMuCi8vIEkgd2FudCB0byBkaXNwbGF5IHRoZSByZXN1bHRzIG9mIHRoZSBmaWxlcyBhcnJheSBpbiB0aGlzIG9yZGVyLgokc29ydF9hcnJheSA9IGFycmF5KCdtcDQnLCdtcGVnJywnZmx2JywnZjR2JywnYXZpJyk7IAokd2VpZ2h0cyA9IGFycmF5X2ZsaXAoJHNvcnRfYXJyYXkpOwovLyBUaGlzIGlzIHRoZSBhcnJheSBJIHdvdWxkIGxpa2UgdG8gc29ydCBvbiBmaWxldHlwZS4gVGhlIGRhdGEgaXMgY29taW5nIGZyb20gQW1hem9uIHNpbXBsZSBEQi4uLiAKLy8gYW5kIGFnYWluIGEgZ2l2ZW4gbWVkaWEgb2JqZWN0IHdpbGwgb25seSBoYXZlIGEgc21hbGwgaGFuZGZ1bCBvZiBmaWxlcy4uLiBpbiBmYWN0IAovLyBwcm9iYWJseSBubyBtb3JlIHRoYW4gdHdvIG9yIHRocmVlLgokZmlsZXMgPSBhcnJheSgKCWFycmF5KCd0aXRsZSc9PidyYWNlIGRheScsJ2ZpbGV0eXBlJz0+J2Y0dicsJ2ZpbGVuYW1lJz0+J3JhY2luZy5mNHYnKSwKCWFycmF5KCd0aXRsZSc9PidwbGF5aW4gY2hlY2tlcnMnLCdmaWxldHlwZSc9PidtcDQnLCdmaWxlbmFtZSc9PidjaGVja2Vycy5tcDQnKSwKCWFycmF5KCd0aXRsZSc9PidwbGF5aW4gY2hlY2tlcnMnLCdmaWxldHlwZSc9PidtcDMnLCdmaWxlbmFtZSc9PidjaGVja2Vycy5tcDMnKSwKCWFycmF5KCd0aXRsZSc9PidwbGF5aW4gY2hlY2tlcnMnLCdmaWxldHlwZSc9PidhdmknLCdmaWxlbmFtZSc9PidjaGVja2Vycy5hdmknKSwKCWFycmF5KCd0aXRsZSc9PidlYXRpbmcgbWVsb25zJywnZmlsZXR5cGUnPT4nbXA0JywnZmlsZW5hbWUnPT4nd2F0ZXJtZWxvbi5tcDQnKSwKCWFycmF5KCd0aXRsZSc9PidlYXRpbmcgbWVsb25zIChhdWRpbyknLCdmaWxldHlwZSc9PidtcDMnLCdmaWxlbmFtZSc9Pid3YXRlcm1lbG9uLm1wMycpCik7CnVzb3J0KCRmaWxlcywgbWFrZV9jb21wYXJlcihbJ2ZpbGV0eXBlJywgU09SVF9BU0MsIGZ1bmN0aW9uKCR0KSB1c2UgKCR3ZWlnaHRzKSB7IHJldHVybiAkd2VpZ2h0c1skdF07IH1dKSk7CgpwcmludF9yKCRmaWxlcyk7CgoKCmZ1bmN0aW9uIG1ha2VfY29tcGFyZXIoKSB7CiAgICAvLyBOb3JtYWxpemUgY3JpdGVyaWEgdXAgZnJvbnQgc28gdGhhdCB0aGUgY29tcGFyZXIgZmluZHMgZXZlcnl0aGluZyB0aWR5CiAgICAkY3JpdGVyaWEgPSBmdW5jX2dldF9hcmdzKCk7CiAgICBmb3JlYWNoICgkY3JpdGVyaWEgYXMgJGluZGV4ID0+ICRjcml0ZXJpb24pIHsKICAgICAgICAkY3JpdGVyaWFbJGluZGV4XSA9IGlzX2FycmF5KCRjcml0ZXJpb24pCiAgICAgICAgICAgID8gYXJyYXlfcGFkKCRjcml0ZXJpb24sIDMsIG51bGwpCiAgICAgICAgICAgIDogYXJyYXkoJGNyaXRlcmlvbiwgU09SVF9BU0MsIG51bGwpOwogICAgfQoKICAgIHJldHVybiBmdW5jdGlvbigkZmlyc3QsICRzZWNvbmQpIHVzZSAoJiRjcml0ZXJpYSkgewogICAgICAgIGZvcmVhY2ggKCRjcml0ZXJpYSBhcyAkY3JpdGVyaW9uKSB7CiAgICAgICAgICAgIC8vIEhvdyB3aWxsIHdlIGNvbXBhcmUgdGhpcyByb3VuZD8KICAgICAgICAgICAgbGlzdCgkY29sdW1uLCAkc29ydE9yZGVyLCAkcHJvamVjdGlvbikgPSAkY3JpdGVyaW9uOwogICAgICAgICAgICAkc29ydE9yZGVyID0gJHNvcnRPcmRlciA9PT0gU09SVF9ERVNDID8gLTEgOiAxOwoKICAgICAgICAgICAgLy8gSWYgYSBwcm9qZWN0aW9uIHdhcyBkZWZpbmVkIHByb2plY3QgdGhlIHZhbHVlcyBub3cKICAgICAgICAgICAgaWYgKCRwcm9qZWN0aW9uKSB7CiAgICAgICAgICAgICAgICAkbGhzID0gY2FsbF91c2VyX2Z1bmMoJHByb2plY3Rpb24sICRmaXJzdFskY29sdW1uXSk7CiAgICAgICAgICAgICAgICAkcmhzID0gY2FsbF91c2VyX2Z1bmMoJHByb2plY3Rpb24sICRzZWNvbmRbJGNvbHVtbl0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJGxocyA9ICRmaXJzdFskY29sdW1uXTsKICAgICAgICAgICAgICAgICRyaHMgPSAkc2Vjb25kWyRjb2x1bW5dOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBEbyB0aGUgYWN0dWFsIGNvbXBhcmlzb247IGRvIG5vdCByZXR1cm4gaWYgZXF1YWwKICAgICAgICAgICAgaWYgKCRsaHMgPCAkcmhzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gLTEgKiAkc29ydE9yZGVyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCRsaHMgPiAkcmhzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMSAqICRzb3J0T3JkZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAwOyAvLyB0aWVicmVha2VycyBleGhhdXN0ZWQsIHNvICRmaXJzdCA9PSAkc2Vjb25kCiAgICB9Owp9Cg==