For 2-dimensional arrays looking like:
Array ( [0] => Array ( [id] => 1 [name] => roger [age] => 31 ) [1] => Array ( [id] => 2 [name] => brutus [age] => 24 ) [2] => Array ( [id] => 3 [name] => ganesh [age] => 92 ) )
I find that comb sort is usually the fastest but its worst case is much worst than quick sort so it could become a bottleneck depending on your data.
<?php ini_set( 'memory_limit', '128M' ) ; /** * @desc bubble_sort for 2 dimensional array (all the arrays of the 2nd dimension need to have the field $sort_by) * @param array^2 $data the array of arrays * @param string $sort_by the parameter that will be used for comparison * @param string $sort_direction "asc": ascending, "desc": descending */ function bubble_sort( $data, $sort_by, $sort_direction ) { if( $sort_direction=='asc' ) { for( $i=1 ; $i<count($data) ; $i++ ) { for( $j=1 ; $j<count($data) ; $j++ ) { if( $data[$j-1][$sort_by]>$data[$j][$sort_by] ) { $temp = $data[$j-1] ; $data[$j-1] = $data[$j] ; $data[$j] = $temp ; } } } } else { for( $i=1 ; $i<count($data) ; $i++ ) { for( $j=1 ; $j<count($data) ; $j++ ) { if( $data[$j-1][$sort_by]<$data[$j][$sort_by] ) { $temp = $data[$j-1] ; $data[$j-1] = $data[$j] ; $data[$j] = $temp ; } } } } return $data ; } /** * @desc comb_sort for 2 dimensional array (all the arrays of the 2nd dimension need to have the field $sort_by) * @param array^2 $data the array of arrays * @param string $sort_by the parameter that will be used for comparison * @param string $sort_direction "asc": ascending, "desc": descending */ function comb_sort( $data, $sort_by, $sort_direction ) { $gap = count( $data ) ; $swaps = -1 ; while( !($gap<=1 && $swaps==0) ) { if( $gap>1 ) { $gap = $gap/1.3 ; if( $gap==10 || $gap==9 ) { $gap = 11 ; } } $i = 0 ; $swaps = 0 ; while( !(($i+$gap)>=count($data)) ) { if( ($sort_direction=='asc' && $data[$i][$sort_by]>$data[$i+$gap][$sort_by]) || ($sort_direction=='desc' && $data[$i][$sort_by]<$data[$i+$gap][$sort_by]) ) { $temp = $data[$i] ; $data[$i] = $data[$i+$gap] ; $data[$i+$gap] = $temp ; $swaps = 1 ; } $i++ ; } } return $data ; } /** * @desc quick_sort for 2 dimensional arrays (all the arrays of the 2nd dimension need to have the field $sort_by) * @param array^2 $data the array of arrays * @param string $sort_by the parameter that will be used for comparison * @param string $sort_direction "asc": ascending, "desc": descending */ function quick_sort( $data, $sort_by, $sort_direction ) { if( count($data)<=1 || $sort_by=='' ) { return $data ; } else { $pivot = $data[0][$sort_by] ; $x = $y = array() ; for( $i=1 ; $i<count($data) ; $i++ ) { if( $data[$i][$sort_by]<$pivot ) { if( $sort_direction=="asc" ) { $x[] = $data[$i] ; } else { $y[] = $data[$i] ; } } else { if( $sort_direction=="asc" ) { $y[] = $data[$i] ; } else { $x[] = $data[$i] ; } } } return array_merge( quick_sort($x, $sort_by, $sort_direction), array($data[0]), quick_sort($y, $sort_by, $sort_direction) ) ; } } ?>