Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to sort a multidemensional array by an inner key

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
                        )

like image 843
Derek Vance Avatar asked Dec 23 '22 04:12

Derek Vance


2 Answers

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);
like image 198
Teekin Avatar answered Jan 10 '23 08:01

Teekin


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]);
});
like image 40
laurent Avatar answered Jan 10 '23 09:01

laurent