2016-03-12 9 views
0

Я хотел бы получить максимальное значение (y) из следующего json-файла.PHP - Получить максимальное значение из json-файла

[{ 
    "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" 
       }] 
      }] 

Пробовали с макс()

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

echo $max["y"]; 

, но я не получаю никакого результата ...

+0

вы используете неправильную переменную, возможно, должно быть '$ max_value ['y']' non '$ max ['y']' – Naumov

ответ

1

Ниже будет получить наибольшее значение у:

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

    echo $max_value['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.

Предупреждение

Приведенный выше код работает только потому, что JSON OP, когда преобразуется в массив имеет элемент, он хочет, чтобы заказать его массив, в качестве первого индексированной стоимости.

Так как @MatsLindh указано ниже в комментариях, если у вас есть значение с ключом «x» вместо «y», независимо от того, где он находится в 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 прошли через мою первую функцию она будет возвращать желаемый результат ОП искали, однако.

[{ 
    "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, элемент с ключом «а» портит порядок подсчитывать, так как она расположена в начале массива.

Заключение

Если вы знаете, что первое значение массива генерируемого из JSON всегда будет то, что вы хотите, чтобы рассчитывать на то мой код хорошо. В противном случае вам лучше использовать решение @ MatsLindh.

+0

Ваш ответ слишком хорош. Просто добавьте print_r ($ max_value ['y']); и это будет прекрасно, потому что он хочет значение только для Y, а не для массива. –

+0

@YousafHassan Point принят. Пересмотренный ответ. Однако я видел, что лучше использовать 'echo' вместо' print_r', поскольку '$ max_value ['y']' всегда кажется строкой. –

+0

Вы правы, эхо делает работу, и да, я проголосовал за ваш ответ, потому что он лучше всех остальных, включая мои. –

0

Поскольку вы действительно пытается получить максимальное значение а определенный столбец в массиве (выполнение всего max($json[1]['data']) само по себе не имеет смысла, так как каждый элемент в этом массиве является самим ассоциативным массивом), вам нужно будет выбрать значения, которые вы хотите найти с максимальным значением:

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

Это будет извлекать значение каждое из y столбца каждого элемента в массиве $json["data"], и возвращает наибольшее значение подарок (через max).

array_column был добавлен в PHP 5.5, но вы можете эмулировать через небольшую вспомогательную функцию, если вы находитесь на старую версию:

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

$ json ['data'] не существует, потому что у него есть объекты массива в контексте вопроса – Naumov

+0

@Naumov Хорошая точка. Я добавил [1]. – MatsLindh

+0

, почему добавление '[1]' после, возможно, перед добавлением '[1] [data]' – Naumov

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! 
0

Вы можете посмотреть этот массив в формате PHP с помощью функции var_dump

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

и вам нужно не использовать максимум, потому что это последний элемент в массиве вам нужно проверить существует ключ name = values значений както foreach или array_map для analise You массива в ключе существует 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 
    } 
} 
Смежные вопросы