1

In php I have a numerical array of associative arrays:

mainArray: 
[
  array1:['title':'Record a','order':'2'],
  array2:['title':'Record b','order':'4'],
  array3:['title':'Record c','order':'1'],
  array4:['title':'Record d','order':'3']
]

What is the simplest way to sort mainArray by the 'order' value of each associative array?

Thanks

1

4 Answers 4

2

You can use usort function. Since PHP 5.4 you can use closure function:

usort($mainArray, function ($a, $b) {
  $a_val = (int) $a['order'];
  $b_val = (int) $b['order'];

  if($a_val > $b_val) return 1;
  if($a_val < $b_val) return -1;
  return 0;
});

Or version for PHP < 5.4:

usort($mainArray, 'myCompare');

function myCompare($a, $b) {
  $a_val = (int) $a['order'];
  $b_val = (int) $b['order'];

  if($a_val > $b_val) return 1;
  if($a_val < $b_val) return -1;
  return 0;
}
Sign up to request clarification or add additional context in comments.

Comments

0

The simplest version, using comparison function and usort:

usort($mainArray, function($a, $b) {
  return $a['order'] - $b['order'];
});

2 Comments

@Dharman, why not? Just checked on latest RC, works fine.
I can't remember why I said that. In hindsight my comment was not very helpful. Sorry
0

This one liner worked for me:

array_multisort(array_column($mainArray,'order'), SORT_ASC, SORT_REGULAR, $mainArray);

The function sorts the second array using the sorted sequence of the first array (which in this case is the array column "order").

Comments

-1

I found this in the php documentation comments for asort() See also the sort() page, in the comments there are a few good candidates.

function named_records_sort($named_recs, $order_by, $rev=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;} // named_recs_sort()

function show_sorted_records($named_recs, $order_by, $rev=false, $flags=0)
{$sorted_records=named_records_sort($named_recs, $order_by, $rev, $flags);
foreach($sorted_records as $name=>$fields)
  {echo "<b>$name</b>   ";
   foreach($fields as $field=>$val)
          echo "$field = $val "; echo "<br>";}
} // show_sorted_records()

$girl_friends=array();
$girl_friends["Anna"]=
array("born"=>'1989-08-22',"cupsize"=>'B-',"IQ"=>105, "daddy"=>'rich');
$girl_friends["Zoe"]
=array("born"=>'1978-03-11',"cupsize"=>'C#',"IQ"=>130, "daddy"=>'poor');
$girl_friends["Lilly"]
=array("born"=>'1985-06-16',"cupsize"=>'DD',"IQ"=>90, "daddy"=>'nasty');

$order_by="cupsize"; echo "And the winners are: <br>";
show_sorted_records($girl_friends, $order_by, true);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.