Sort a multidimensional array based on given key value
How to sort a multidimensional array based on a given key value.
<?php
/**
* Sort an array based on a given field key
*
* @param unknown_type $named_recs
* @param unknown_type $order_by
* @param unknown_type $rev
* @param unknown_type $flags
* @return unknown
*/
function _named_records_sort($named_recs, $order_by, $reverse=false, $flags=0) {
// Create 1-dimensional named array with just sortfield (in stead of record) values
$named_hash = array();
foreach($named_recs as $key=>$fields)
$named_hash["$key"] = $fields[$order_by];
// Order 1-dimensional array,
// maintaining key-value relations
if($reverse) arsort($named_hash,$flags=0) ;
else asort($named_hash, $flags=0);
// Create copy of named records array
// in order of sortarray
$sorted_records = array();
foreach($named_hash as $key=>$val)
$sorted_records["$key"]= $named_recs[$key];
return $sorted_records;
}
?>I have used it to sort a attachment file list in Drupal. I wanted to sort the array based on weight on form_submit to produce a correct preview in my special case.
Array
(
[589] => Array
(
[description] => Bok2.csv
[remove] => 0
[list] => 0
[weight] => -3
[filename] => Bok2.csv
[filepath] => sites/default/files/Bok1.csv
[filemime] => text/csv
[filesize] => 48
[fid] => 589
[new] =>
)
[592] => Array
(
[description] => Bok1.csv
[remove] => 0
[list] => 0
[weight] => -4
[filename] => Bok1.csv
[filepath] => sites/default/files/Bok2.csv
[filemime] => text/csv
[filesize] => 42
[fid] => 592
[new] =>
)
[595] => Array
(
[description] => Bok3.csv
[remove] => 0
[list] => 0
[weight] => 0
[filename] => Bok3.csv
[filepath] => sites/default/files/Bok3.csv
[filemime] => text/csv
[filesize] => 48
[fid] => 595
[new] =>
)
)Call the function like this.
<?php
$report->files = _named_records_sort($report->files, 'weight', FALSE, true);
?>Sort multi array on 2 fields
<?php
// Obtain a list of columns
foreach ($data as $key => $row) {
$volume[$key] = $row['volume'];
$edition[$key] = $row['edition'];
}
// Sort the data with volume descending, edition ascending
// Add $data as the last parameter, to sort by the common key
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
?>