Sort an associative array in php with multiple condition

arrays, associative-array, multidimensional-array, php, usort

Solution

You're half way there (though you were sorting backwards for `membkey` based on your example):

function order_by_member_key($a, $b)
{
  if ($a['membkey'] == $b['membkey'])
  {
    // membkey is the same, sort by head
    if ($a['head'] == $b['head']) return 0;
    return $a['head'] == 'y' ? -1 : 1;
  }

  // sort the higher membkey first:
  return $a['membkey'] < $b['membkey'] ? 1 : -1;
}
usort($details, "order_by_member_key");

Problem

Consider following array ``` $details = array( array('lname'=>'A', 'fname'=>'P','membkey'=>700,'head'=>'y'), array('lname'=>'B', 'fname'=>'Q','membkey'=>540,'head'=>'n'), array('lname'=>'C', 'fname'=>'R','membkey'=>700,'head'=>'n'), array('lname'=>'D', 'fname'=>'S','membkey'=>540,'head'=>'y'), array('lname'=>'E', 'fname'=>'T','membkey'=>700,'head'=>'n') ); ``` Here I would like to sort with head and membkey. Top element of same membkey element should have 'head=y' and echoed as, ``` $details = array( array('lname'=>'A', 'fname'=>'P','membkey'=>700,'head'=>'y'), array('lname'=>'E', 'fname'=>'T','membkey'=>700,'head'=>'n'), array('lname'=>'C', 'fname'=>'R','membkey'=>700,'head'=>'n'), array('lname'=>'D', 'fname'=>'S','membkey'=>540,'head'=>'y'), array('lname'=>'B', 'fname'=>'Q','membkey'=>540,'head'=>'n') ); ``` I tried it as follows ``` function orderbymemberKey( $a, $b ){ if ( $a[membkey] == $b[membkey] ) return 0; return($a[membkey] < $b[membkey] )? -1 :1; } usort( $details, orderbymemberKey ); and it successfully order by membkey. ``` Any suggestions please.

Original source