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.