首页 > 解决方案 > 使用数组中找到的数值从高到低排序多维数组

问题描述

我目前正在寻找一种有效的方法来根据最高->最低使用对数组/对象进行排序avgTotalPoints,然后根据字段中的排名放置一个数值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;
}

JSON 输入

{
    "mlb": {
        "james": {
            "avgTotalPoints": 80.675,
            "avgPointsDifferential": -0.8112500000000002,
            "rank": null
        },
        "mary": {
            "avgTotalPoints": 114.9875,
            "avgPointsDifferential": 6.262500000000003,
            "rank": null
        },
        "lucas": {
            "avgTotalPoints": 66.825,
            "avgPointsDifferential": -9.10625,
            "rank": null
        },
        "timothy": {
            "avgTotalPoints": 69.2625,
            "avgPointsDifferential": -19.14125,
            "rank": null
        },
        "samantha": {
            "avgTotalPoints": 91.625,
            "avgPointsDifferential": -36.85000000000001,
            "rank": null
        }
    },
    "nhl": {
        "samantha": {
            "avgTotalPoints": 82.20000000000002,
            "avgPointsDifferential": 15.005714285714289,
            "rank": null
        },
        "peter": {
            "avgTotalPoints": 77.65714285714284,
            "avgPointsDifferential": -13.31857142857143,
            "rank": null
        },
        "rick": {
            "avgTotalPoints": 91.61428571428571,
            "avgPointsDifferential": 11.217142857142859,
            "rank": null
        },
        "bubba": {
            "avgTotalPoints": 119.60000000000001,
            "avgPointsDifferential": 28.13333333333334,
            "rank": null
        },
        "james": {
            "avgTotalPoints": 90.18571428571428,
            "avgPointsDifferential": 10.915714285714285,
            "rank": 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
                )

        )

)
```

标签: php

解决方案


由于您的数组包含多个要单独排序的子数组,您可以利用array_map将排序应用于这些子数组中的每一个。

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

此外,您不需要使用array_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);
}

演示


推荐阅读