Helpful Information
 
 
Category: Post a PHP snippet
Sorting an multidimensional array

This function sorts a multidimensional (tabular) array by one or more columns.

<?php
/* usage
sortDataSet(data set, column1[, mixed arg [, mixed ... [, array ...]]])
*/
/* arguments
the first argument is the multidimensional array
subsequent arguments follow the argument order of array_multisort(),
except that you do not pass arrays to the function but keys (string!) of the columns
*/
/* note
read the documentation of array_multisort() for more information
*/
function sortDataSet(&$dataSet) {
$args = func_get_args();
$callString = 'array_multisort(';
$usedColumns = array();
for($i = 1, $count = count($args); $i < $count; ++$i) {
switch(gettype($args[$i])) {
case 'string':
$callString .= '$dataSet[\''.$args[$i].'\'], ';
array_push($usedColumns, $args[$i]);
break;
case 'integer':
$callString .= $args[$i].', ';
break;
default:
throw new Exception('expected string or integer, given '.gettype($args[$i]));
}
}
foreach($dataSet as $column => $array) {
if(in_array($column, $usedColumns)) continue;
$callString .= '$dataSet[\''.$column.'\'], ';
}
eval(substr($callString, 0, -2).');');
}

/* example usage */
$latestPost = array(
'title' => array(
'title0',
'title1',
'title2',
'title5',
'title3'
),
'name' => array(
'name0',
'name1',
'name2b',
'name2a',
'name3'
),
'date' => array(
'0',
'1',
'2b',
'2a',
'3'
)
);
sortDataSet($latestPost, 'name', SORT_DESC, SORT_STRING, 'title', SORT_DESC, SORT_STRING);
echo '<pre>';
print_r($latestPost);
echo '</pre>';
?>dumpfi

The following shoud do it. pass the array, index is what element you want to sort on (in your case use 3). Then you can sort asc or desc, and weather you want to use natural sorting (the way a human would sort, 2 before 10) and lastly case sensitive or not if using natural sort. Only the first 2 args are needed, the rest will default.



function sort2d ($array, $index, $order='asc', $natsort=FALSE, $case_sensitive=FALSE)
{
if(is_array($array) && count($array)>0)
{
foreach(array_keys($array) as $key)
$temp[$key]=$array[$key][$index];
if(!$natsort)
($order=='asc')? asort($temp) : arsort($temp);
else
{
($case_sensitive)? natsort($temp) : natcasesort($temp);
if($order!='asc')
$temp=array_reverse($temp,TRUE);
}
foreach(array_keys($temp) as $key)
(is_numeric($key))? $sorted[]=$array[$key] : $sorted[$key]=$array[$key];
return $sorted;
}
return $array;
}

Wow! Thank you for sharing so usefull information

When sorting alphabetically, is there a way to ignore the word "The".
I'm running into this issue with a list of company names.

Brookes
Corporation B
Test Industries
The Best Way
Tims Company

Ideally, 'The Best Way' would be sorted by 'Best' and not 'The'.










privacy (GDPR)