2016-06-08 21 views
-2

erwartet Ich habe eine einfache zweidimensionale Anordnung:usort verhält sich nicht wie

$users = array(
    array('user' => 'John', 'points' => '0'), 
    array('user' => 'Paul', 'points' => '0'), 
    array('user' => 'George', 'points' => '0'), 
    array('user' => 'Ringo', 'points' => '0') 
); 

Ich brauche sie zu sortieren, indem points (DESC) und dann von name (ASC). Dies würde mein Code sein:

function sortByOrder($a, $b) { 
    if($b['points'] == $a['points']) 
     return $a['user'] - $b['user']; 
    else 
     return $b['points'] - $a['points']; 
} 

usort($users, 'sortByOrder'); 

ich die ursprüngliche Reihenfolge statt eine alphabetische Reihenfolge (da sie alle 0 Punkte haben zur Zeit). Warum?

+0

User sind nicht zählbar. Überprüfen Sie den zurückgegebenen Booleschen Wert. –

+1

Was ist 'John' minus' Paul'? oder 'Ringo' minus' George'? –

Antwort

1

Sie müssen array_multisort verwenden:

DEMO

$users = array(
    array('user' => 'John', 'points' => '0'), 
    array('user' => 'Paul', 'points' => '0'), 
    array('user' => 'George', 'points' => '0'), 
    array('user' => 'Ringo', 'points' => '0') 
); 

$sort = array(); 
foreach($users as $k=>$v) { 
    $sort['points'][$k] = $v['points']; 
    $sort['user'][$k] = $v['user']; 
} 

array_multisort($sort['points'], SORT_DESC, $sort['user'], SORT_ASC,$users); 

print_r($users); 

Ergebnis:

Array 
(
    [0] => Array 
     (
      [user] => George 
      [points] => 0 
     ) 

    [1] => Array 
     (
      [user] => John 
      [points] => 0 
     ) 

    [2] => Array 
     (
      [user] => Paul 
      [points] => 0 
     ) 

    [3] => Array 
     (
      [user] => Ringo 
      [points] => 0 
     ) 

) 

Und diese DEMO mit verschiedenen Punkten

1

Sie müssen strcmp verwenden, also Ihre functio n sollte

function sortByOrder($a, $b) { 
    if($b['points'] == $a['points']) 
    { 
     return strcmp($a['user'], $b['user']); 
    } 
    else{ 
     return $b['points'] - $a['points']; 
    } 
} 

prüfen wie diese hier: https://eval.in/585383

Verwandte Themen