JSON_NUMERIC_CHECK и номера телефонов
Наш PHP API выводит результаты с помощью json_encode с включенным JSON_NUMERIC_CHECK, что важно для финансовых показателей, двоичных значений и т.д., но мы недавно представили поле номера телефона, и оно удаляет нули с начала номера при его нажатии это как целое число.
Я попытался заставить "(string)" тип значения до того, как он перейдет в json_encode, но похоже, что функция переопределяет его. например:
$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}
Любые предложения о том, как лучше всего справиться с этим, будут высоко оценены. Я действительно не хочу прибегать к добавлению конечных пробелов в конце номера телефона, когда он выводит только для того, чтобы получить его как строку.
Спасибо!
Ответы
Ответ 1
Вместо того, чтобы приписывать его строке, сделайте что-то вроде этого:
$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);
Он сохраняет конечный ноль:
{
"is_bool": 1,
"total_amount": 431.65,
"phone_number": "\"0272561313\""
}
Decode:
$test = json_encode($output,JSON_NUMERIC_CHECK | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
$test = json_decode($test, true);
print_r($test);
Вывод:
Array
(
[is_bool] => 1
[total_amount] => 431.65
[phone_number] => "0272561313"
)
Ответ 2
Вы можете попробовать следующее:
{
"is_bool": 1,
"total_amount": 431.65,
"phone_number": "xn#0272561313"
}
как пример в mysql:
SELECT CONCAT ('xn #', phone_number) как phone_number...
Если вы использовали json_encode()
, замените строку следующим образом:
echo str_replace('xn#','',$your_encoded_json);
Ответ 3
Если у вас такая же проблема с телефонными номерами, это перемещается по массиву (без объектов!), чтобы отличать только числовые значения, не начинающиеся с 0 или + с int или float.
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);
Ответ 4
передать данные в эту функцию, чтобы получить кодировку JSON с + и 0 предшествующими данными, оставаясь в виде строки. Я использую двойное кодирование и str_replace, чтобы преодолеть проблему.
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;
}
Ответ 5
Вам не нужно использовать
JSON_NUMERIC_CHECK
Вместо этого используйте приведение атрибутов
https://laravel.com/docs/5.1/eloquent-mutators#attribute-casting
class SomeModel extends Model
{
protected $casts = [
'field_name' => 'array',
'status' => 'boolean'
];
}
Ответ 6
работает для меня:
// $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);
//output: [{"tel": "0606060606"}, {"tel": "0707070707"}]
Может быть, определить пробел в CSS или данные обрезки в кодировке json
для получения идеального разобранного номера
Ответ 7
Для чего это стоит, у меня была аналогичная проблема, потому что у меня есть международные телефонные номера, начинающиеся с символа +
. Я использовал urlencode
в строке номера телефона, чтобы решить проблему:
$phone = urlencode( $phone );