Php json_decode在字符串数字的第一个字符处删除零

Php json_decode在字符串数字的第一个字符处删除零,php,json,Php,Json,当我将前导为零的电话号码(即字符串)传递给json\u decode时,它会删除第一个零字符并将其转换为浮点数 $string = '09178882356'; //dynamic value echo json_decode($string); //9178882356 will be echo 如何预防 编辑: Florent提供了一种解决方案,可以使用以下内容: echo json_decode('"'.$string.'"'); 它可以工作,但是如果$string是一个真正的JSON

当我将前导为零的电话号码(即字符串)传递给
json\u decode
时,它会删除第一个零字符并将其转换为浮点数

$string = '09178882356'; //dynamic value
echo json_decode($string); //9178882356 will be echo
如何预防

编辑
Florent提供了一种解决方案,可以使用以下内容:

echo json_decode('"'.$string.'"');
它可以工作,但是如果
$string
是一个真正的JSON字符串,那么它将失败。

您正在解码一个数字。 您应该将代码更改为:

echo json_decode('"09178882356"');
编辑:

它可以工作,但是如果
$string
是一个真正的JSON字符串,那么它就会失败

问题是您并不真正了解对象类型。也许您应该停止向这个函数发送真正的JSON字符串,或者在函数外用引号将数字括起来

您可以尝试以下方法:

if (is_number($str)) {
    $str = '"'.$str.'"';
}

echo json_decode($str);

以下函数将考虑多个前导零,并在遇到前导零时转换为字符串:

    function check_number($num){
        $re = '/[0]+/m';

        preg_match_all($re, $num, $matches, PREG_SET_ORDER, 0); 

        $leading_zero = $matches[0][0] ?? false;
        $length = 0;

        if( $leading_zero !== false){
            $length = strlen($num);

            $test = "%'.0{$length}d\n";

            return sprintf("%'.0{$length}d\n",$num);                
        }

        return $num;
    }
$one = '07';
$one = check_number($one) // returns '07' string with json_encode and JSON_NUMERIC_CHECK flag

$two = '007';
$two = check_number($two) // returns '007' string with json_encode and JSON_NUMERIC_CHECK flag

$num = 7;
$num = check_number($num) // returns 7 int with json_encode and JSON_NUMERIC_CHECK flag