Php 多维数组使用数组中的数值从高到低排序

Php 多维数组使用数组中的数值从高到低排序,php,Php,我目前正在寻找一种有效的方法,使用avgTotalPoints根据最高->最低对数组/对象进行排序,然后在rank字段中根据rank放置一个数值。我看了一些例子,并能够相应地创建一个函数。然而,它现在正在发挥作用。我试图在下面显示的排序函数中访问avgTotalPoints,但由于数组是多深度的,因此无法访问。关于如何实现这一点,有什么指导吗 function sortHighestToLowest($arr) { if (isset($arr) && !empty($a

我目前正在寻找一种有效的方法,使用
avgTotalPoints
根据最高->最低对数组/对象进行排序,然后在
rank
字段中根据rank放置一个数值。我看了一些例子,并能够相应地创建一个函数。然而,它现在正在发挥作用。我试图在下面显示的排序函数中访问
avgTotalPoints
,但由于数组是多深度的,因此无法访问。关于如何实现这一点,有什么指导吗

function sortHighestToLowest($arr)
{
    if (isset($arr) && !empty($arr)) {
        uasort($arr, function ($a, $b) {
            return $a['avgTotalPoints'] <=> $b['avgTotalPoints'];
        });
        return array_reverse($arr);
    }
    return null;
}
期望结果

stdClass Object
(
    [mlb] => stdClass Object
        (            
            [mary] => stdClass Object
                (
                    [avgTotalPoints] => 114.9875
                    [avgPointsDifferential] => 6.2625
                    [rank] => 1
                )
            
            [samantha] => stdClass Object
                (
                    [avgTotalPoints] => 91.625
                    [avgPointsDifferential] => -36.85
                    [rank] => 2
                )
                
            [james] => stdClass Object
                (
                    [avgTotalPoints] => 80.675
                    [avgPointsDifferential] => -0.81125
                    [rank] => 3
                )

            [timothy] => stdClass Object
                (
                    [avgTotalPoints] => 69.2625
                    [avgPointsDifferential] => -19.14125
                    [rank] => 4
                )

            [lucas] => stdClass Object
                (
                    [avgTotalPoints] => 66.825
                    [avgPointsDifferential] => -9.10625
                    [rank] => 5
                )

        )

    [nhl] => stdClass Object
        (
            [bubba] => stdClass Object
                (
                    [avgTotalPoints] => 119.6
                    [avgPointsDifferential] => 28.133333333333
                    [rank] => 1
                )
                
            [rick] => stdClass Object
                (
                    [avgTotalPoints] => 91.614285714286
                    [avgPointsDifferential] => 11.217142857143
                    [rank] => 2
                )

            [james] => stdClass Object
                (
                    [avgTotalPoints] => 90.185714285714
                    [avgPointsDifferential] => 10.915714285714
                    [rank] => 3
                )       
        
            [samantha] => stdClass Object
                (
                    [avgTotalPoints] => 82.2
                    [avgPointsDifferential] => 15.005714285714
                    [rank] => 4
                )

            [peter] => stdClass Object
                (
                    [avgTotalPoints] => 77.657142857143
                    [avgPointsDifferential] => -13.318571428571
                    [rank] => 5
                )

        )

)
```

由于您的阵列包含多个子阵列,您希望对这些子阵列进行单独排序,因此可以利用对每个子阵列应用排序

这样做之后,您就可以简单地循环相同的子数组(通过引用),同时递增
$rank
变量,并将其分配给每个条目

此外,不需要使用
数组\u reverse
来反转排序,只需反转
比较的操作数即可

function sortHighestToLowest(array $arr): array
{
  return array_map(static function (array $entries): array {
    uasort($entries, static function (array $entry1, array $entry2): int {
      return $entry2['avgTotalPoints'] <=> $entry1['avgTotalPoints'];
    });

    $rank = 0;
    foreach ($entries as &$entry) {
      $entry['rank'] = ++$rank;
    }

    return $entries;
  }, $arr);
}
函数sortHighestToLowest(数组$arr):数组
{
返回数组映射(静态函数(数组$entries):数组{
uasort($entries,静态函数(数组$entry1,数组$entry2):int{
返回$entry2['avgTotalPoints']$entry1['avgTotalPoints'];
});
$rank=0;
foreach($entries as&$entry){
$entry['rank']=++$rank;
}
返回$entries;
},$arr);
}

输入数组是什么样子的?旁注:同时使用
isset()
!如果条件是冗余的,则为空()
。您只需使用
!empty()
因为这也包括了
isset()的功能。@Jeto抱歉,我现在添加了json输入。@MagnusEriksson很好。我总是对此感到困惑。我会改变的,这太完美了。我正在阅读
array\u map
,并正在了解如何使用它!
function sortHighestToLowest(array $arr): array
{
  return array_map(static function (array $entries): array {
    uasort($entries, static function (array $entry1, array $entry2): int {
      return $entry2['avgTotalPoints'] <=> $entry1['avgTotalPoints'];
    });

    $rank = 0;
    foreach ($entries as &$entry) {
      $entry['rank'] = ++$rank;
    }

    return $entries;
  }, $arr);
}