5

i have this enormous array that i am pulling from an API for BattleField Bad Company 2, and the soldier stats can be pulled as a multi dimensional array with an inner array for each soldier, however the API sormats it sorting the soldiers by name alphabetically, i want to sort them by rank (which is just another key within that soldiers array). ive been trying to figure this out for days, anyone have any ideas? (ie sort the array by $arr[players][][rank]

here is a bit of the array

Array
(
    [players] => Array
        (
            [0] => Array
                (
                    [name] => bigjay517
                    [rank] => 29
                    [rank_name] => SECOND LIEUTENANT II
                    [veteran] => 0
                    [score] => 979440
                    [level] => 169
                    [kills] => 4134
                    [deaths] => 3813
                    [time] => 292457.42
                    [elo] => 319.297
                    [form] => 1
                    [date_lastupdate] => 2010-03-30T14:06:20+02:00
                    [count_updates] => 13
                    [general] => Array
                        (
                            [accuracy] => 0.332
                            [dogr] => 86
                            [dogt] => 166
                            [elo0] => 309.104
                            [elo1] => 230.849
                            [games] => 384
                            [goldedition] => 0
                            [losses] => 161
                            [sc_assault] => 146333
                            [sc_award] => 567190
                            [sc_bonus] => 35305
                            [sc_demo] => 96961
                            [sc_general] => 264700
                            [sc_objective] => 54740
                            [sc_recon] => 54202
                            [sc_squad] => 53210
                            [sc_support] => 70194
                            [sc_team] => 21215
                            [sc_vehicle] => 44560
                            [slevel] => 0
                            [spm] => 0
                            [spm0] => 0
                            [spm1] => 0
                            [srank] => 0
                            [sveteran] => 0
                            [teamkills] => 67
                            [udogt] => 0
                            [wins] => 223
                        )

Derek Vance
  • 51
  • 1
  • 2

6 Answers6

5

Here you go.

$playergoop is the array that you provided.

This one sorts by the sub-field 'rank', but it does so in an ascending order. If you want a descending order, you can switch the > to <.

function sorter($one, $two) {
    return ($one['rank'] > $two['rank']);
}

usort($playergoop['players'], sorter);
Teekin
  • 12,581
  • 15
  • 55
  • 67
4

In addition to the other answers, if you need to sort by a dynamic field (only known at runtime), you can use an anonymous function and pass it the field via the use keyword:

$field = "some_dynamic_value";

usort($rows, function($a, $b) use ($field) {
    return strcmp($a[$field], $b[$field]);
});
laurent
  • 88,262
  • 77
  • 290
  • 428
3

You can sort any array by any criteria using usort()

Your Common Sense
  • 156,878
  • 40
  • 214
  • 345
  • see my detailed response below for exactly how to do this – Gabi Lee Sep 06 '17 at 07:53
  • `usort()` can sort any array, but it won't return every array, necessarily, as expected. It might be helpful to let readers know about `uasort()` and `uksort()` in case they require key associations be maintained, etc. – slothluvchunk Jul 20 '18 at 22:11
2

When you're using PHP 5.3 and above you can use an anonymous inline function for sorting:

usort($obj, function ($a, $b)
{
    return strcmp($a["name"], $b["name"]);
});
Gabi Lee
  • 1,193
  • 8
  • 13
2

You can use array_multisort for this: first provide the column you want to sort -- with array_column and as second argument the whole array. There are several options possible (see documentation), but for an ascending sort by the "rank" field, it would look like this:

array_multisort(array_column($players, "rank"), $players);

NB: For the data in the actual question here, $players would be &$arr["players"]

trincot
  • 317,000
  • 35
  • 244
  • 286
0

To order descending an array, I used

function sorterdesc($one, $two) {
    return ($two['cont'] - $one['cont']);
}

For ascending :

function sorterasc($one, $two) {
    return ($one['cont'] - $two['cont']);
}

Like this it works fine with numeric values

Mahdi
  • 9,247
  • 9
  • 53
  • 74
RBrazao
  • 49
  • 1
  • 6