我想从以下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"];
但我没有得到任何结果......
答案 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
)。
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
函数
$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
以获取foreach
或array_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
}
}