PHP 2-dimensional array sorting algorithms

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) ) ;
        }
    }
?>

Leave a Reply

Your email address will not be published. Required fields are marked *