简体   繁体   English

如何按点对这个多维数组进行排序?

[英]How to sort this multidimensional array by points?

I have a script that runs through football fixtures, each day it will work out the teams played, wins, draws, losses, gd and points.我有一个贯穿足球赛程的脚本,每天它都会计算出比赛的球队,获胜,平局,失利,gd和积分。 At the end of each day it will upload the table to the database, so that I have a different table for each day (I have my reasons for it lol)在每天结束时,它会将表上传到数据库,以便我每天都有不同的表(我有我的理由哈哈)

Problem is here is an example my code that creates the 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
}

So the final array would be like所以最终的数组会像

[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
    )

How would I be to order the array by 'points' -> 'goaldifference' -> 'name'.我将如何通过 'points' -> 'goaldifference' -> 'name' 对数组进行排序。

I have looked at things like uSort, but because the second part of my array, is team names,and that I want to order by 3 increasing values.我看过像 uSort 这样的东西,但因为我数组的第二部分是团队名称,我想按 3 个递增的值排序。 I can't find anything that seems to get me to understand how to do it.我找不到任何似乎让我了解如何去做的事情。

Sorry if you know of a duplicate, I have had a search, but I haven't been able to find anything.抱歉,如果您知道重复项,我进行了搜索,但找不到任何内容。

This answer is tested on php 7.2这个答案在 php 7.2 上测试过

You can sort complex structures with usort()您可以使用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>';
 ?>

We can use uasort(), or else we will loose team key.我们可以使用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>';
 ?>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM