10

I know there are some other topics about sorting with multiple criteria, but they don't fix my problem. Let's say I have this array:

Array
(
    [0] => Array
        (
            [uid] => 1
            [score] => 9
            [endgame] => 2
        )

    [1] => Array
        (
            [uid] => 2
            [score] => 4
            [endgame] => 1
        )

    [2] => Array
        (
            [uid] => 3
            [score] => 4
            [endgame] => 100
        )

    [3] => Array
        (
            [uid] => 4
            [score] => 4
            [endgame] => 70
        )

)

I want to sort it, putting the one with the HIGHEST score on top. On same score, I want the one with the LOWEST endgame number on top. The sorting mechanisme should rank user1 on top, then user2, then 4 and then user3.

I use this sorting mechanisme:

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

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

This gives me the following array:

Array
(
    [0] => Array
        (
            [uid] => 1
            [score] => 9
            [endgame] => 2
        )

    [1] => Array
        (
            [uid] => 3
            [score] => 4
            [endgame] => 100
        )

    [2] => Array
        (
            [uid] => 2
            [score] => 4
            [endgame] => 1
        )

    [3] => Array
        (
            [uid] => 4
            [score] => 4
            [endgame] => 70
        )

)

As you can see, the array isn't sorted properly... Anyone knows what I'm doing wrong? Thanks a lot!

3
  • 2
    $a['endgame'] == 'y'...!? There's no 'y' in your values. Commented Jul 3, 2014 at 16:37
  • I see... I found this sorting mechanisme on stackoverflow.com/questions/3606156/… , makes sence there since the head-values are "y" or "n". Is there an easy fix for my particular question? I just can't understand this sorting with multiple criteria... even after reading the manual and other threads about this... Commented Jul 3, 2014 at 16:42
  • Closing this as duplicate of the canonical explanation. Please read it, it should explain how sorting works and enable you to fix your code. Commented Jul 3, 2014 at 16:44

1 Answer 1

18

Your function should be like this:

function order_by_score_endgame($a, $b) {
    if ($a['score'] == $b['score']) {
        // score is the same, sort by endgame
        if ($a['endgame'] > $b['endgame']) {
            return 1;
        }
    }

    // sort the higher score first:
    return $a['score'] < $b['score'] ? 1 : -1;
}

Try it out. It will give you result like this:

Array
(
[0] => Array
    (
        [uid] => 1
        [score] => 9
        [endgame] => 2
    )

[1] => Array
    (
        [uid] => 2
        [score] => 4
        [endgame] => 1
    )

[2] => Array
    (
        [uid] => 4
        [score] => 4
        [endgame] => 70
    )

[3] => Array
    (
        [uid] => 3
        [score] => 4
        [endgame] => 100
    )

)
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.