<?php
array ( 'zz' , 'name' => 'Jack' , 'number' => 22 , 'birthday' => '12/03/1980' ) , array ( 'xx' , 'name' => 'Adam' , 'number' => 16 , 'birthday' => '01/12/1979' ) , array ( 'aa' , 'name' => 'Paul' , 'number' => 16 , 'birthday' => '03/11/1987' ) , array ( 'cc' , 'name' => 'Helen' , 'number' => 44 , 'birthday' => '24/06/1967' ) , ) ;
usort ( $data , make_comparer
( 'description' ) ) ;
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
} ;
}
PD9waHAKCiRkYXRhID0gYXJyYXkoCiAgICBhcnJheSgnenonLCAnbmFtZScgPT4gJ0phY2snLCAnbnVtYmVyJyA9PiAyMiwgJ2JpcnRoZGF5JyA9PiAnMTIvMDMvMTk4MCcpLAogICAgYXJyYXkoJ3h4JywgJ25hbWUnID0+ICdBZGFtJywgJ251bWJlcicgPT4gMTYsICdiaXJ0aGRheScgPT4gJzAxLzEyLzE5NzknKSwKICAgIGFycmF5KCdhYScsICduYW1lJyA9PiAnUGF1bCcsICdudW1iZXInID0+IDE2LCAnYmlydGhkYXknID0+ICcwMy8xMS8xOTg3JyksCiAgICBhcnJheSgnY2MnLCAnbmFtZScgPT4gJ0hlbGVuJywgJ251bWJlcicgPT4gNDQsICdiaXJ0aGRheScgPT4gJzI0LzA2LzE5NjcnKSwKKTsKCnVzb3J0KCRkYXRhLCBtYWtlX2NvbXBhcmVyKCdkZXNjcmlwdGlvbicpKTsKcHJpbnRfcigkZGF0YSk7CgoKZnVuY3Rpb24gbWFrZV9jb21wYXJlcigpIHsKICAgIC8vIE5vcm1hbGl6ZSBjcml0ZXJpYSB1cCBmcm9udCBzbyB0aGF0IHRoZSBjb21wYXJlciBmaW5kcyBldmVyeXRoaW5nIHRpZHkKICAgICRjcml0ZXJpYSA9IGZ1bmNfZ2V0X2FyZ3MoKTsKICAgIGZvcmVhY2ggKCRjcml0ZXJpYSBhcyAkaW5kZXggPT4gJGNyaXRlcmlvbikgewogICAgICAgICRjcml0ZXJpYVskaW5kZXhdID0gaXNfYXJyYXkoJGNyaXRlcmlvbikKICAgICAgICAgICAgPyBhcnJheV9wYWQoJGNyaXRlcmlvbiwgMywgbnVsbCkKICAgICAgICAgICAgOiBhcnJheSgkY3JpdGVyaW9uLCBTT1JUX0FTQywgbnVsbCk7CiAgICB9CgogICAgcmV0dXJuIGZ1bmN0aW9uKCRmaXJzdCwgJHNlY29uZCkgdXNlICgkY3JpdGVyaWEpIHsKICAgICAgICBmb3JlYWNoICgkY3JpdGVyaWEgYXMgJGNyaXRlcmlvbikgewogICAgICAgICAgICAvLyBIb3cgd2lsbCB3ZSBjb21wYXJlIHRoaXMgcm91bmQ/CiAgICAgICAgICAgIGxpc3QoJGNvbHVtbiwgJHNvcnRPcmRlciwgJHByb2plY3Rpb24pID0gJGNyaXRlcmlvbjsKICAgICAgICAgICAgJHNvcnRPcmRlciA9ICRzb3J0T3JkZXIgPT09IFNPUlRfREVTQyA/IC0xIDogMTsKCiAgICAgICAgICAgIC8vIElmIGEgcHJvamVjdGlvbiB3YXMgZGVmaW5lZCBwcm9qZWN0IHRoZSB2YWx1ZXMgbm93CiAgICAgICAgICAgIGlmICgkcHJvamVjdGlvbikgewogICAgICAgICAgICAgICAgJGxocyA9IGNhbGxfdXNlcl9mdW5jKCRwcm9qZWN0aW9uLCAkZmlyc3RbJGNvbHVtbl0pOwogICAgICAgICAgICAgICAgJHJocyA9IGNhbGxfdXNlcl9mdW5jKCRwcm9qZWN0aW9uLCAkc2Vjb25kWyRjb2x1bW5dKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRsaHMgPSAkZmlyc3RbJGNvbHVtbl07CiAgICAgICAgICAgICAgICAkcmhzID0gJHNlY29uZFskY29sdW1uXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRG8gdGhlIGFjdHVhbCBjb21wYXJpc29uOyBkbyBub3QgcmV0dXJuIGlmIGVxdWFsCiAgICAgICAgICAgIGlmICgkbGhzIDwgJHJocykgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xICogJHNvcnRPcmRlcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgkbGhzID4gJHJocykgewogICAgICAgICAgICAgICAgcmV0dXJuIDEgKiAkc29ydE9yZGVyOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gMDsgLy8gdGllYnJlYWtlcnMgZXhoYXVzdGVkLCBzbyAkZmlyc3QgPT0gJHNlY29uZAogICAgfTsKfQo=