PHP - 从json文件中获取最高价值

时间:2016-03-12 21:02:29

标签: php json max

我想从以下json文件中获取最高值(y)。

   [{
     "name": "Time",
     "data": ["20:40", "20:45", "20:50"]
     },
     {
     "name": "Values",
     "data": [{
               "y": 5774,
               "v1": "Test1",
               "v2": "20:40"
              },
              {
               "y": 5555,
               "v1": "Test2",
               "v2": "20:45"
              },
              {
               "y": 5235,
               "v1": "Test3",
               "v2": "20:50"
              }]
            }]

用max()

尝试
$json_data = file_get_contents('file.json');
$json = json_decode($json_data, true);
$max_value = max($json["data"]);

echo $max["y"];

但我没有得到任何结果......

4 个答案:

答案 0 :(得分:1)

以下内容将检索最大的y值:

<?php
    $json_data = file_get_contents('a.json');
    $json = json_decode($json_data, true);
    $max_value = max($json[1]["data"]);

    echo $max_value['y'];
?>

以下将检索具有最大y值的数组:

<?php
$json_data = file_get_contents('a.json');
$json = json_decode($json_data, true);
$max_value = max($json[1]["data"]);

print_r($max_value);
?>

您的脚本问题是您尝试访问第3行中不存在的数组,并且您没有正确地回显$ max_value数组。

警告

上述代码只能起作用,因为转换为数组时OP的JSON具有他想要将其数组作为第一个索引值的元素。

所以就像@MatsLindh在评论中所说的那样,如果你有一个值为&#39; x&#39;而不是&#39; y&#39;,无论它位于JSON的哪个位置,只要它仍然是最低的键值,将它作为从JSON转换为数组时的第一个索引值。阵列。

您可以在提供的JSON中使用混合匹配值,只要您要排序的元素具有最低值键,将其作为数组中索引的第一个元素。例如:

   [{
     "name": "Time",
     "data": ["20:40", "20:45", "20:50"]
     },
     {
     "name": "Values",
     "data": [{
               "y": 5774,
               "v1": "Test1",
               "v2": "20:40",
               "Z" : 8000
              },
              {
               "y": 5555,
               "v1": "Test2",
               "v2": "20:45",
               "Abc": 6754
              },
              {
               "y": 5235,
               "v1": "Test3",
               "v2": "20:50",
               "v3": 6594
              }]
            }]

如果上面的JSON通过我的第一个函数传递,它将返回OP正在寻找的所需结果。

   [{
     "name": "Time",
     "data": ["20:40", "20:45", "20:50"]
     },
     {
     "name": "Values",
     "data": [{
               "y": 5774,
               "v1": "Test1",
               "v2": "20:40",
                "a": 897
              },
              {
               "y": 5555,
               "v1": "Test2",
               "v2": "20:45"
              },
              {
               "y": 5235,
               "v1": "Test3",
               "v2": "20:50"
              }]
            }]

使用这组JSON,带有键的元素&#34; a&#34;因为它被放置在数组的开头,所以会使计数顺序混乱。

<强>结论

如果您知道从JSON生成的数组的第一个值将始终是您想要计算的数,那么我的代码就可以了。否则你最好使用@ MatsLindh的解决方案。

答案 1 :(得分:0)

因为你真的试图获取数组中某个列的最大值(只做max($json[1]['data'])本身没有意义,就像那个数组中的每个元素一样是一个关联数组本身),你必须选择你想要找到的最大值的值:

$max_value = max(array_column($json[1]["data"], "y"));

这将从y数组中每个元素的$json["data"]列中提取每个值,并返回最大值(通过max)。

在PHP 5.5中添加了

array_column,但是如果您使用的是旧版本,则可以通过小帮助函数来模拟它:

function array_column($array, $column) {
    $ret = array();
    foreach ($array as $elem) {
        $ret[] = $elem[$column];
    }
    return $ret;
}

答案 2 :(得分:0)

问题是你的json_decoded数据不是以数组形式存在,但也包括STD对象,所以在你的情况下找到最大值的另一种方法是使用下面的算法。

$json_data = file_get_contents('file.json');
$json = json_decode($json_data, true);
$max_value = null;
foreach($json[1]->data as $dt){
    if($dt->y > $max_value)
        $max_value = $dt->y;
}
echo $max_value; // There it will output the highest value!

答案 3 :(得分:0)

您可以通过var_dump函数

以php格式查看此数组
$json_data = file_get_contents('file.json');
$json = json_decode($json_data, true);
$max_value = max($json["data"]);
var_dump($max_value);

并且您需要不要使用max,因为数组中的最后一个元素 您需要检查存在键name = values以获取foreacharray_map的值,以便在存在键name = values中对数组进行分析(例如

$json_data = file_get_contents('file.json');
$json = json_decode($json_data, true);
foreach($json as $_js) {
   if($_js['name'] != 'Values') {
      continue;
   }
   foreach($_js['data'] as $__js) {
       echo $__js['y']; // or push to temporary variable
   }
}