【问题标题】:How to generate an array using 3rd-level values of a multi-dimensional array如何使用多维数组的第三级值生成数组
【发布时间】:2017-05-19 05:48:03
【问题描述】:

如下所示,我有一个多维数组,在第三层有一个关联数组,我试图根据gamesCount 对其进行操作。我想在每项运动中生成具有最高 gamesCount 的新项目数组。有没有一种有效的方法,而不会矫枉过正?

编辑:它可能是n 的运动数量,因此目标是为每项运动找到gameCounts 的最大数量。

初始数组:

$array = [
    [
        ["sport" => "soccer", "gamesCount" => 5, "gamesId" => 1],
        ["sport" => "soccer", "gamesCount" => 3, "gamesId" => 2],
        ["sport" => "soccer", "gamesCount" => 10, "gamesId" => 3],
        ["sport" => "soccer", "gamesCount" => 10, "gamesId" => 4],
    ],
    [
        ["sport" => "basketball", "gamesCount" => 1, "gamesId" => 5],
        ["sport" => "basketball", "gamesCount" => 3, "gamesId" => 6],
        ["sport" => "basketball", "gamesCount" => 3, "gamesId" => 7],
        ["sport" => "basketball", "gamesCount" => 8, "gamesId" => 8],
    ]
];

期望的结果:

array(3) {
      [0]=>
      array(3) {
        ["sport"]=>
        string(6) "soccer"
        ["gamesCount"]=>
        int(10)
        ["gamesId"]=>
        int(3)
      }
      [1]=>
      array(3) {
        ["sport"]=>
        string(6) "soccer"
        ["gamesCount"]=>
        int(10)
        ["gamesId"]=>
        int(4)
      }
      [2]=>
      array(3) {
        ["sport"]=>
        string(10) "basketball"
        ["gamesCount"]=>
        int(5)
        ["gamesId"]=>
        int(8)
      }
}

【问题讨论】:

    标签: php arrays sorting multidimensional-array max


    【解决方案1】:

    试试这个,检查live demo

    $result = [];
    foreach($array as $v)
    {
    $max = max(array_column($v, 'gamesCount'));
        $result = array_merge($result, array_filter($v, function($value)use($max){return $value['gamesCount'] == $max;}));
    }
    var_dump($result);
    

    【讨论】:

    • 我收到一个错误:Warning: max(): Array must contain at least one element 这行 return max(array_column($v, 'gameCount'));。我仔细检查了$array 确实包含一个数组及其元素。
    • @MaryCoding 有错误,应该是代码中的gamesCount。
    • 它产生一个空数组。检查这个GIST
    • @KrisRoofe 没有 Kris,请检查编辑历史记录。相同的结构。现在她正在使用我的 php-ready 变量,而不是她第一次发布的 print_r 输出。运动总是在两个独立的子数组中。
    • @mickmackusa 抱歉,我想念使用函数。立即查看
    【解决方案2】:

    输入:

    $array=[
        [
            ["sport"=>"soccer","gamesCount"=>5,"gamesId"=>1],
            ["sport"=>"soccer","gamesCount"=>3,"gamesId"=>2],
            ["sport"=>"soccer","gamesCount"=>10,"gamesId"=>3],
            ["sport"=>"soccer","gamesCount"=>10,"gamesId"=>4]
        ],
        [
            ["sport"=>"basketball","gamesCount"=>1,"gamesId"=>5],
            ["sport"=>"basketball","gamesCount"=>3,"gamesId"=>6],
            ["sport"=>"basketball","gamesCount"=>3,"gamesId"=>7],
            ["sport"=>"basketball","gamesCount"=>8,"gamesId"=>8]
        ]
    ];
    

    方法#1“具有两个循环的最容易阅读的版本”(Demo)

    foreach($array as $sport_array){
        $most_in_sport=max(array_column($sport_array,'gamesCount'));  // get highest gamesCount in sport's subarray      
        foreach($sport_array as $sport_row){
            if($sport_row['gamesCount']==$most_in_sport){  // only keep a sport's subarray (row) if its gamesCount is the highest in the sport
                $most_per_sport[]=$sport_row;
            }
        }
    }
    var_export($most_per_sport);
    

    方法 #2:“令人费解的可变参数单线”php minimum version: 5.6(对于那些希望不惧怕单线启示录的人——参考:第一条评论@https://stackoverflow.com/a/43950486/2943403.) (Demo)

    var_export(array_merge(...array_map(function($sport_array){$most_in_sport=max(array_column($sport_array,'gamesCount')); return array_filter($sport_array,function($sport_row)use($most_in_sport){return $sport_row['gamesCount']==$most_in_sport;});},$array)));
    

    输出:

    array (
      0 => 
      array (
        'sport' => 'soccer',
        'gamesCount' => 10,
        'gamesId' => 3,
      ),
      1 => 
      array (
        'sport' => 'soccer',
        'gamesCount' => 10,
        'gamesId' => 4,
      ),
      2 => 
      array (
        'sport' => 'basketball',
        'gamesCount' => 8,
        'gamesId' => 8,
      ),
    )
    

    决定使用哪种方法取决于每个程序员。第一种方法将是最有效且 IMO 最容易理解的方法。第二个将生成更少的全局变量并且需要更少的代码行。如果您试图避免“over-kill”,则无法击败方法 #1。

    【讨论】:

    • 这仅处理两个数组,但问题是它可能是n 数组数。例如。 basketball、soccer、baseball等
    • @MaryCoding 你现在怎么想?我提供了两种方法来适应一系列 php 版本。
    • 这让我更接近结果,但这是行是硬编码的$top3 = array_slice($array, 0, 3); // extract the top 3 subarrays。它可能是n 的运动数量,因此n 的数量是max 的gameCounts。特别是如果某些值相同。
    • @MaryCoding 你从来没有在你的问题中说在哪里画线,所以我复制了你想要的结果。您可以将其更改为您喜欢的任何内容。
    • 你是对的。我很抱歉。我会更新这个问题。谢谢。
    猜你喜欢
    • 2018-07-12
    • 1970-01-01
    • 2021-06-23
    • 2012-10-19
    • 1970-01-01
    • 2019-12-05
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多