首页 > 解决方案 > 从 JSON 对象中获取最大值

问题描述

我正在尝试从以下 JSON 对象中获取player最高值。rating我有两支球队homeaway我想比较所有球员的所有评分并返回最高rating值和球员的评分name

   {
        "lineup": {
            "home": {
                "starters": [{
                        "name": "Andreas",
                        "statistics": {
                            "rating": 6.38
                        }
                    },
                    {
                        "name": "Carlos",
                        "statistics": {
                            "rating": 6.87
                        }
                    }
                ]
            },
            "away": {
                "starters": [{
                        "name": "Felix",
                        "statistics": {
                            "rating": 7.20
                        }
                    },
                    {
                        "name": "Daniel",
                        "statistics": {
                            "rating": 4.87
                        }
                    }
                ]
            }
        }
    }

请记住,我的 JSON 包含 30 个playersratings不是 4 个

到目前为止我所尝试的。

尝试#1:

我试图获取maxfromhomeawayteam 然后比较这两个值并获得最高值,由于某种原因它不会返回每个团队的最大值。Ex for teamhome返回的playerrating 6.38另一个而不是另一个。

//Home
$max = max($decode_one['lineup']['home']['starters']);
$finalVal = $max['statistics']['rating']; 

//Away
$max1 = max($decode_one['lineup']['away']['starters']);
$finalVal1 = $max1['statistics']['rating'];

尝试#2:

在这里,我将里面的评级添加到一个新数组中,然后使用循环从数组中获取最大值。我遇到的两个问题首先是 JSON 包括 30 个玩家,15 个来自home和 15 个away,出于某种原因,它只包含来自两者的 15 个玩家,home 而不是来自两者。我认为这是因为每个团队的密钥都是相同的(0-14),而另一个问题我也希望返回nameselected player

$result = array();
foreach ($decode_one['lineup'] as $homeOrAway) {
    foreach ($homeOrAway as $startersOrSubs) {
        foreach ($startersOrSubs as $key => $value) {
            $result[$key['rating']][]  = $value['statistics']['rating'];            
        }
    }
}

foreach ($result as $key => $maxValue) {
    echo "{$key}: " . max($maxValue) . "\n";
}

有任何想法吗?

谢谢

标签: javascriptphparraysjsonmax

解决方案


PHP 版本,array_reduce用于查找来自“home”和“away”的玩家组合数组中的最大元素:

$max = array_reduce(
  array_merge(
    $decode_one['lineup']['home']['starters'],
    $decode_one['lineup']['away']['starters']
  ),
  function($carry, $item) {
    if( $carry === NULL) {
      return $item;
    }
    else {
      return $carry['statistics']['rating'] > $item['statistics']['rating'] ?
        $carry : $item;
    }
  }
);

推荐阅读