Usage function for sorting and grouping

advertisements

I have this array.

Array
(
    [0] => Array
        (
            [name] => SUNDERLAND
            [pts] => 2
            [gd] => -4
            [group] => A
        )

    [1] => Array
        (
            [name] => NEWCASTLE
            [pts] => 2
            [gd] => -3
            [group] => C
        )

    [2] => Array
        (
            [name] => STOKE CITY
            [pts] => 2
            [gd] => -2
            [group] => B
        )

    [3] => Array
        (
            [name] => WATFORD
            [pts] => 3
            [gd] => -2
            [group] => A
        )

    [4] => Array
        (
            [name] => TOTTENHAM
            [pts] => 3
            [gd] => -1
            [group] => B
        )

    [5] => Array
        (
            [name] => CHELSEA
            [pts] => 4
            [gd] => -5
            [group] => C
        )

    [6] => Array
        (
            [name] => NORWICH
            [pts] => 4
            [gd] => -3
            [group] => D
        )

    [7] => Array
        (
            [name] => WEST BROM
            [pts] => 4
            [gd] => -4
            [group] => D
        )

)

I must sort and group this array elements by some criterias.

In the same group first NAME is name with greater pts parameter (DESC by pts parameter). If pts parameters the same order by gd parameter (DESC by gd parameter)

Team names with the same Group together.

Name        pts     gd      group

WATFORD     3       -2      A
SUNDERLAND  2       -4      A
TOTTENHAM   3       -1      B
STOKE CITY  2       -2      B
CHELSEA     4       -5      C
NEWCASTLE   2       -3      C
NORWICH     4       -3      D
WEST BROM   4       -4      D

in this moment I can sort by pts and gd as follows:

<?php
function sortByOrder($a, $b){
    $c = $a['pts'] - $b['pts'];
    $c .= $a['gd'] - $b['gd'];
    return $c;
}
usort($all_teams_nf, 'sortByOrder');

foreach($all_teams_nf as $myarr){
    foreach($myarr as $key => $team){
        if($key!="pts" and $key!="gd" and $key!="group"){
            $all_teams[] = $team;
        }
    }
}

$all_teams = array_reverse($all_teams);
?>

Please help to combine by groups and then in each group order by pts and gd. (In final result I need to show group name and team names!

A
    WATFORD
    SUNDERLAND
B
    TOTTENHAM
    STOKE CITY
C
    CHELSE
    NEWCASTLE
D
    NORWICH
    WEST BROM


I would use array_multisort instead of usort for this. First group your rows by the group key. Then use array_multisort on each group. Finally you can use ksort if you need the groups to appear in sorted order as well.

$arraysByGroup = array();

// group by group key
foreach($array as $element) {
    $arraysByGroup[$element['group']][] = $element;
}

// sort each group by name, pts, gd
foreach($arraysByGroup as &$group) {

    $name = $pts = $gd = array();

    foreach($group as $key => $value) {
        $name[$key] = $value['name'];
        $pts[$key] = $value['pts'];
        $gd[$key] = $value['gd'];
    }

    array_multisort($name, SORT_ASC, $pts, SORT_DESC, $gd, SORT_DESC, $group);
}

ksort($arraysByGroup);
print_r($arraysByGroup);