如何按点对多维数组排序?

时间:2018-10-20 21:05:52

标签: php arrays sorting multidimensional-array

我有一个脚本贯穿足球比赛,每天都会计算出球队的出场次数,获胜,平局,输球,总成绩和得分。每天结束时,它将表上载到数据库,这样我每天都有一个不同的表(我有这样做的原因,哈哈)

问题是我的代码创建数组的示例。

if (array_key_exists(strval($firstDate), $matches)) {
// Matches Exist
foreach($matches[$firstDate] as $matchList) {
    $homeName = $matchList['homeTeamName'];
    $homeScore = intval($matchList['homeTeamScore']);
    $awayName = $matchList['awayTeamName'];
    $awayScore = intval($matchList['awayTeamScore']);

    $table[$homeName]['played']++;
    $table[$awayName]['played']++;
    // Check results
    if ($homeScore > $awayScore) {
      $table[$homeName]['homeWon']++;
      $table[$awayName]['awayLost']++;
      $table[$homeName]['points'] = $table[$homeName]['points'] + 3;
    } else if ($homeScore == $awayScore) {
      $table[$homeName]['homeDrawn']++;
      $table[$awayName]['awayDrawn']++;
      $table[$homeName]['points']++;
      $table[$awayName]['points']++;
    } else {
      $table[$homeName]['homeLost']++;
      $table[$awayName]['awayWon']++;
      $table[$awayName]['points'] = $table[$awayName]['points'] + 3;
    }

    $table[$homeName]['homeFor'] = $table[$homeName]['homeFor'] + $homeScore;
    $table[$homeName]['homeAgainst'] = $table[$homeName]['homeAgainst'] + $awayScore;
    $table[$awayName]['awayFor'] = $table[$awayName]['awayFor'] + $awayScore;
    $table[$awayName]['awayAgainst'] = $table[$awayName]['awayAgainst'] + $homeScore;

    $table[$homeName]['goalDifference'] = intval($table[$homeName]['homeFor']) + intval($table[$homeName]['awayFor']) - intval($table[$homeName]['homeAgainst']) + intval($table[$homeName]['awayAgainst']);
    $table[$awayName]['goalDifference'] = intval($table[$awayName]['homeFor']) + intval($table[$awayName]['awayFor']) - intval($table[$awayName]['homeAgainst']) + intval($table[$awayName]['awayAgainst']);


}
usort($table, function($a, $b) {
return $a['points'] - $b['points'];
});

} else {
// Matches Don't Exist
}

所以最终的数组就像

[Dover_Athletic] => Array
    (
        [name] => Dover_Athletic
        [league_name] => National League
        [competitionId] => 5
        [currentDateLeague] => 
        [position] => 0
        [played] => 3
        [homeWon] => 0
        [homeDrawn] => 0
        [homeLost] => 1
        [homeFor] => 0
        [homeAgainst] => 1
        [awayWon] => 0
        [awayDrawn] => 1
        [awayLost] => 1
        [awayFor] => 3
        [awayAgainst] => 4
        [goalDifference] => 6
        [points] => 1
    )

[Braintree_Town] => Array
    (
        [name] => Braintree_Town
        [league_name] => National League
        [competitionId] => 5
        [currentDateLeague] => 
        [position] => 0
        [played] => 3
        [homeWon] => 0
        [homeDrawn] => 0
        [homeLost] => 1
        [homeFor] => 0
        [homeAgainst] => 2
        [awayWon] => 0
        [awayDrawn] => 1
        [awayLost] => 1
        [awayFor] => 1
        [awayAgainst] => 2
        [goalDifference] => 1
        [points] => 1
    )

如何通过'points'->'goaldifference'->'name'对数组进行排序。

我看过类似uSort的东西,但是因为数组的第二部分是团队名称,所以我想按3个递增值排序。我找不到任何能使我理解如何做的东西。

很抱歉,如果您知道重复的内容,我已经进行了搜索,但找不到任何东西。

2 个答案:

答案 0 :(得分:3)

  

此答案已在php 7.2上进行了测试

您可以使用usort()

对复杂结构进行排序
 <?php

$teams = [
    'team1' => [
        'name' => 'Albertsens',
        'points' => 2,
        'goalDifference' => 2
    ],
    'team2' => [
        'name' => 'idkjustanameiguess',
        'points' => 4,
        'goalDifference' => 5
    ],

    'team3' => [
        'name' => 'another1',
        'points' => 4,
        'goalDifference' => 3
    ],

    'team4' => [
        'name' => 'rickross',
        'points' => 4,
        'goalDifference' => 2
    ],

    'team5' => [
        'name' => 'bigboss',
        'points' => 4,
        'goalDifference' => 2
    ],

    'team6' => [
        'name' => 'zoppa',
        'points' => 1,
        'goalDifference' => 3
    ],
    'team7' => [
        'name' => 'bertsen',
        'points' => 9,
        'goalDifference' => 6
    ],
];

$orderBy = ['points' => 'desc', 'goalDifference' => 'desc', 'name' => 'asc']; //just edit this to conform to your specification

usort($teams, function ($a, $b) use ($orderBy) {
    $ReturnValues = [true => -1, false => 1];
    $bIsBigger = true;
    $isAscending = 1;

    foreach ($orderBy as $key => $value) {
        $isAscending = ($value === 'asc') ? 1 : -1; //checks whether to go in ascending or descending order
        $bIsBigger = ($a[$key] < $b[$key]);  //does the comparing of target key; E.G 'points'

        if ($a[$key] !== $b[$key]) { //if values do not match
            return $ReturnValues[$bIsBigger] * $isAscending; //the multiplication is done to create a negative return value incase of descending order
        }

    }

    return $ReturnValues[$bIsBigger] * $isAscending;
});

echo '<pre>';
print_r($teams);
echo '</pre>';
 ?>

答案 1 :(得分:0)

我们可以使用uasort(),否则我们将丢失团队密钥。

<?php

$teams = [
    'team1' => [
        'name' => 'Albertsens',
        'points' => 2,
        'goalDifference' => 2
    ],
    'team2' => [
        'name' => 'idkjustanameiguess',
        'points' => 4,
        'goalDifference' => 5
    ],

    'team3' => [
        'name' => 'another1',
        'points' => 4,
        'goalDifference' => 3
    ],

    'team4' => [
        'name' => 'rickross',
        'points' => 4,
        'goalDifference' => 2
    ],

    'team5' => [
        'name' => 'bigboss',
        'points' => 4,
        'goalDifference' => 2
    ],

    'team6' => [
        'name' => 'zoppa',
        'points' => 1,
        'goalDifference' => 3
    ],
    'team7' => [
        'name' => 'bertsen',
        'points' => 9,
        'goalDifference' => 6
    ],
];

$orderBy = ['points' => 'desc', 'goalDifference' => 'desc', 'name' => 'asc']; //just edit this to conform to your specification

uasort($teams, function ($a, $b) use ($orderBy) {
    $ReturnValues = [true => -1, false => 1];
    $bIsBigger = true;
    $isAscending = 1;

    foreach ($orderBy as $key => $value) {
        $isAscending = ($value === 'asc') ? 1 : -1; //checks whether to go in ascending or descending order
        $bIsBigger = ($a[$key] < $b[$key]);  //does the comparing of target key; E.G 'points'

        if ($a[$key] !== $b[$key]) { //if values do not match
            return $ReturnValues[$bIsBigger] * $isAscending; //the multiplication is done to create a negative return value incase of descending order
        }

    }

    return $ReturnValues[$bIsBigger] * $isAscending;
});

echo '<pre>';
print_r($teams);
echo '</pre>';
 ?>