2011-11-04 114 views
1

我在php json解碼數中遇到了一些麻煩。php json解碼數問題

$json = '[{"num":123456789011121314},{"num":1516171819202122232425}]'; 
$number = json_decode($json); 
foreach($number as $num){ 
    echo $num->num.'<br />'; 
    //echo (int)$num->num.'<br />'; 
} 

這將得到:

1.23456789011E+17 
1.5161718192E+21 

而且(INT)做了錯誤的回調。以及如何獲得原信號?謝謝。

我需要

123456789011121314  
1516171819202122232425 
+2

可能的重複http://stackoverflow.com/questions/2907806/handling-big-user-ids-returned-by-fql-in-php –

回答

3

如果你使用PHP 5.4或更高版本,你可以這樣做:

$number = json_decode($json, true, 512, JSON_BIGINT_AS_STRING);

這將代表那些大量的字符串,而不是整數。如果您有權訪問生成json的代碼,則還可以將數字編碼爲字符串。

+2

不幸的是,該選項是PHP 5.4 +。 – deceze

+1

你說得對,我已經更新了我的帖子,謝謝 –

+0

非常好,謝謝你張貼這個! – Nate

0

使用128位系統?

即使是64位機器,第二個數字也可以保持爲整數,因此它將被轉換爲浮點數。提示精度損失和指數部分。

另一種解決方案:使用較小的數字。

如果您絕對必須擁有這些號碼,請查看API如BC-MathGMP

1

由於json結構並不複雜,我們可以用一個簡單的正則表達式來修復它。這個想法是用雙引號括起數字。

$json = '[{"num":123456789011121314},{"num":1516171819202122232425}]'; 
$sanitized = preg_replace('/:(\w*\d+)/', ':"$1"', $json); 
$number = json_decode($sanitized); 

這應該對你很好,就像我一樣。

該模式匹配一​​個冒號後跟一些可選的空白後跟一個數字。

+1

爲{「test」產生無效的JSON:「:3432」}。 – gimpe

+0

@gimpe事實上,我不認爲'':3432「'是一個有效的數字。是嗎? – gabriel14

+0

不,但它是一個有效的字符串。事實上,我想警告人們僅在僅有數字的特定情況下使用此正則表達式,並且不能讓用戶輸入看起來像「:number」。它幾乎爲我工作:)謝謝。 – gimpe