首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用多维数组的三级值生成数组

如何使用多维数组的三级值生成数组
EN

Stack Overflow用户
提问于 2017-05-19 05:48:03
回答 2查看 484关注 0票数 1

如下图所示,我有一个多维数组,在第三层中有一个关联数组,我试图基于gamesCount来操作它。我想要生成一个新的项目数组与最高的 gamesCount在每项运动。有没有一种有效的方法可以避免过度杀戮?

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

初始数组:

代码语言:javascript
复制
$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],
    ]
];

预期结果:

代码语言:javascript
复制
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)
      }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-19 05:57:38

试试这个,检查一下现场演示

代码语言:javascript
复制
$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);
票数 1
EN

Stack Overflow用户

发布于 2017-05-19 06:24:22

输入:

代码语言:javascript
复制
$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“具有两个循环的最容易阅读的版本”(演示)

代码语言:javascript
复制
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最低版本: 5.6 (对于那些不害怕一条龙启示录的人来说--参考:第一条评论@ https://stackoverflow.com/a/43950486/2943403.) (演示)

代码语言:javascript
复制
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)));

输出:

代码语言:javascript
复制
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,
  ),
)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44062301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档