Я недавно столкнулся с проблемой, делающей json_encode(rrd_xport($options));
в файлах RRD, созданных Nagios / Nagiosgraph.
json_encode()
кажется падает (таким образом возвращая ЛОЖЬ), когда rrd_xport()
возвращается NaN
как значения элемента. Например (с учетом возврата $ var = rrd_xport ()):
print_r($var)
выход:
Array
(
[1418265300] = 297
[1418265600] = 296.79333333333
[1418265900] = 296.8
[1418266200] = 295.79333333333
[1418266500] = 295.40666666667
[1418266800] = 296
[1418267100] = 296
[1418267400] = 296
[1418267700] = 295.6
[1418268000] = 296
[1418268300] = 296.00666666667
[1418268600] = 296.39333333333
[1418268900] = 295.59333333333
[1418269200] = 295.4
[1418269500] = 295.79333333333
)
json_encode($var)
выход:
{ «1418263800»: 297, «1418264100»: +297,40666666667, «1418264400»: +297,39333333333, «1418264700»: 297, «1418265000»: 297, «1418265300»: 297, «1418265600»: 296,79333333333, «1418265900»: 296,8,» 1418266200 «: 295,79333333333,» 1418266500 «: 295,40666666667,» 1418266800 «: 296,» 1418267100 «: 296,» 1418267400 «: 296,» 1418267700 «: 295,6,» 1418268000 «: 296,» 1418268300 «: +296,00666666667,» 1418268600″ : +296,39333333333, «1418268900»: 295,59333333333, «1418269200»: 295,4, «1418269500»: +295,79333333333}
Теперь, когда мы (rrd_xport) вводим NaN
к значению элемента, мы видим json_encode()
изрыгать:
NEW print_r($var)
выход:
Array
(
[1418265300] = 297
[1418265600] = 296.79333333333
[1418265900] = 296.8
[1418266200] = 295.79333333333
[1418266500] = 295.40666666667
[1418266800] = 296
[1418267100] = 296
[1418267400] = 296
[1418267700] = 295.6
[1418268000] = 296
[1418268300] = 296.00666666667
[1418268600] = 296.39333333333
[1418268900] = 295.59333333333
[1418269200] = 295.4
[1418269500] = 295.79333333333
[1418269800] = NAN
)
var_dump(json_encode($var))
выход:
BOOL (ложь)
Наконец, мой вопрос: как лучше всего с этим справиться — нужно ли тралить весь массив и заменить NaN
? (Реальный результат намного больше, чем в этом примере, и многомерен) Конечно, есть лучший способ!
JSON Спецификация не имеет ничего о том, как кодировать NaN
или же Inf
лица:
Numeric values that cannot be represented as sequences of digits (such as Infinity and NaN) are not permitted.
Вы должны перебрать и заменить is_nan($v)
значения ко всему, что применимо с JSON
, например, к нулю …
Или вы можете реализовать свой собственный js_encode
функция
Заверши цикл по массиву, спасибо vp_arth!
function killnan($maybeHasNan)
{
if (gettype($maybeHasNan) != "array")
{
echo "AHSHIT\n";
return;
}
$iMakedThis = Array();
foreach ($maybeHasNan as $key = $value)
{
if (gettype($value) == "array")
{
# go deeper neo
$iMakedThis[$key] = killnan($value);
}
elseif (gettype($value) == "double" && is_nan($value))
{
$iMakedThis[$key] = NULL;
}
else
{
$iMakedThis[$key] = $value;
}
}
return $iMakedThis;
}