Sort an array dataset in PHP

Posted on November 9, 2008
by

It may be necessary to sort a dataset after a SQL request. And in a general case, I prefer using this function instead of dealing with the ORDER BY and LIMIT clauses.

So I wrote this method (which is part of my Utils class, in my own framework):

/**
* Sort a dataset
* @param array $dataset
* @param string $sortby
* @param string $order (can be either 'ASC' or 'DESC')
*/
public static function sortDataset($dataset,$sortby,$order = 'ASC') {
$columns = array();
 
foreach ($dataset as $key => $row) {
foreach($row as $k => $v) {
$columns[$k][$key] = $v;
}
}
 
if (array_key_exists($sortby,$columns)) {
$params = array();
 
$params[] = &$columns[$sortby];
$params[] = constant('SORT_'.$order);
 
foreach($columns as $key => $column) {
if ($key != $sortby) {
$params[] = &$column;
$params[] = SORT_ASC;
}
}
 
$params[] = &$dataset;
 
call_user_func_array('array_multisort',$params);
}
 
return $dataset;
}

Usage example

$array = array();
 
$array[] = array('id' => 1, 'name' => 'Foo');
$array[] = array('id' => 3, 'name' => 'Bar');
$array[] = array('id' => 8, 'name' => 'Anon');
$array[] = array('id' => 2, 'name' => '4chan');
 
$arraySortedByName = sortDataset($array,'name');
$arraySortedByID = sortDataset($array,'id','DESC');

$arraySortedByName is the same array with lines sorted by the name key.

$arraySortedByID is the same array with lines sorted by the ID key in descendant order.

It’s quite usefull, I don’t understand why there is no such a native function in PHP…

In the example, I define the array manualy but you can imagine it represent the result lines of an SQL query. I hope it’ ll help someone!

About the author

Cyril Mazur is a serial web entrepreneur with experience in various fields: online dating, forex & finance, blogging, online advertising... who enjoys building things that people like to use.

2 comments

  1. Daniel
    on August 6, 2012
    Great function, simple yet very useful
  2. Cyril
    on August 6, 2012
    Thanks Daniel :)

Leave a Reply