массивы — PHP, как json_encode () вернуть из rrd_xport ()?

Я недавно столкнулся с проблемой, делающей 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? (Реальный результат намного больше, чем в этом примере, и многомерен) Конечно, есть лучший способ!

1

Решение

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 функция

2

Другие решения

Заверши цикл по массиву, спасибо 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;
}
1

По вопросам рекламы [email protected]