Php JSON\u数字\u检查和电话号码
我们的PHP API使用json_编码并启用json_数字_检查输出结果,这对于财务数字、二进制值等非常重要。。但我们最近引入了一个电话号码字段,当它将号码转换为整数时,它会从号码的开头删除零 我试图在值转到json_encode之前强制输入“(string)”,但看起来函数正在覆盖它。例如:Php JSON\u数字\u检查和电话号码,php,json,Php,Json,我们的PHP API使用json_编码并启用json_数字_检查输出结果,这对于财务数字、二进制值等非常重要。。但我们最近引入了一个电话号码字段,当它将号码转换为整数时,它会从号码的开头删除零 我试图在值转到json_encode之前强制输入“(string)”,但看起来函数正在覆盖它。例如: $output = array( 'is_bool' => 1, 'total_amount' => '431.65', 'phone_number' => (s
$output = array(
'is_bool' => 1,
'total_amount' => '431.65',
'phone_number' => (string) '0272561313'
);
echo json_encode($output,JSON_NUMERIC_CHECK);
产生:
{"is_bool":1,"total_amount":431.65,"phone_number":272561313}
任何关于如何最好地处理这一问题的建议都将不胜感激。我真的不想在输出电话号码时,为了把它作为一个字符串通过而不得不在电话号码的末尾添加尾随空格
谢谢 不要将其键入字符串,而是执行以下操作:
$output = array(
'is_bool' => 1,
'total_amount' => '431.65',
'phone_number' => '"0272561313"' // add quotations
);
echo '<pre>';
echo json_encode($output,JSON_NUMERIC_CHECK | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
public static function json_encode($data){
$numeric = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);
$nonnumeric = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
preg_match_all("/\"[0\+]+(\d+)\"/",$nonnumeric, $vars);
foreach($vars[0] as $k => $v){
$numeric = preg_replace("/\:\s*{$vars[1][$k]},/",": {$v},",$numeric);
}
return $numeric;
}
解码:
Array
(
[is_bool] => 1
[total_amount] => 431.65
[phone_number] => "0272561313"
)
输出:
array_walk_recursive($json, function (&$value, $key)
{
if(is_string($value) && is_numeric($value))
{
// check if value doesn't starts with 0 or +
if(!preg_match('/^(\+|0)/', $value))
{
// cast $value to int or float
$value += 0;
}
}
});
return json_encode($json);
电话号码也有同样的问题,这会遍历一个数组(没有对象!),只将不以0或+开头的数值转换为int或float
$phone = urlencode( $phone );
值得一提的是,我遇到了一个类似的问题,我的国际电话号码以
+
符号开头。我在我的电话号码字符串上使用了urlencode
,解决了这个问题:
{
"is_bool": 1,
"total_amount": 431.65,
"phone_number": "xn#0272561313"
}
您可以尝试以下方法:
echo str_replace('xn#','',$your_encoded_json);
例如在mysql中:
选择CONCAT('xn#',电话号码)作为电话号码
如果使用了json\u encode()
,请按如下方式替换字符串:
$output = array(
'is_bool' => 1,
'total_amount' => '431.65',
'phone_number' => '"0272561313"' // add quotations
);
echo '<pre>';
echo json_encode($output,JSON_NUMERIC_CHECK | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
public static function json_encode($data){
$numeric = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);
$nonnumeric = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
preg_match_all("/\"[0\+]+(\d+)\"/",$nonnumeric, $vars);
foreach($vars[0] as $k => $v){
$numeric = preg_replace("/\:\s*{$vars[1][$k]},/",": {$v},",$numeric);
}
return $numeric;
}
将数据传递到此函数以获取JSON编码,其中+和0之前的数据保留为字符串。我使用双重编码和stru替换来解决这个问题
class SomeModel extends Model
{
protected $casts = [
'field_name' => 'array',
'status' => 'boolean'
];
}
你不需要使用
JSON\u数字\u检查
而是使用属性转换
为我工作:
//输出:[{“电话”:“0606”},{“电话”:“0707”}]
可能在json编码中定义css空白或修剪数据
为了获得完美的解析数字如果您提供一个简单的示例,这将有助于我们复制您的代码。为什么不共享您尝试过的代码?这个建议可能是一个选项,但我不希望必须评估我输出的每个值,我还可以根据它格式化和存储电话号码,这样可以避免问题“对财务数字很重要”--相反,浮点数会弄乱您的号码。感谢您的详细回答,但是jQuery AJAX请求返回的phone_number字段返回“0272561313”“用引号,而不仅仅是数字。我遗漏了什么吗?@RyanMarshall是的,它应该有引号,因为没有引号,尾随和前导的零将再次被剥离。在我的情况下,这没有帮助。我仍然得到一个整数。无论我将电话号码字符串包装成什么,它都没有帮助(例如,当我编码JSON时,STR053STR仍然只返回53)。有什么想法吗?当我尝试这个方法时,我得到了:
“电话号码”:“0272561313”
,即带有两组引号。包含JSON_UNESCAPED_SLASHES没有明显的影响。您可以删除is_numeric
检查,因为您正在进行预匹配
——只需将其更新为/[1-9][0-9]*\z/a
,尽管这仍然会将一些电话号码转换为整数(不以0开头的电话号码),这很奇怪。你有没有看到问题中提到拉威尔?不然后可能会提到需要一个完整的框架,以及更改程序的整个结构以使用您的“修复”。结尾的空间似乎足够了。
// $DATAS -> datas returned by the server
$DATAS = array(
array('tel' => '0606060606'),
array('tel' => '0707070707')
);
foreach($DATAS as $k => $v){
$tel = " ".$v['tel']." "; // ADD WHITE SPACE
$DATAS[$k]['tel'] = $tel;
}
echo json_encode($DATAS, JSON_NUMERIC_CHECK);