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