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);
?>
Knowledge keywords: