Вопрос:

JSON_NUMERIC_CHECK и номера телефонов

php json

12144 просмотра

5 ответа

198 Репутация автора

Наш 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}

Любые предложения о том, как лучше всего справиться с этим, будут высоко оценены. Я действительно не хочу прибегать к добавлению завершающих пробелов в конце телефонного номера, когда он выводится, просто чтобы получить его в виде строки.

Спасибо!

Автор: Ryan Marshall Источник Размещён: 02.07.2014 12:00

Ответы (5)


7 плюса

7681 Репутация автора

Вместо того, чтобы типизировать его в строку, сделайте что-то вроде этого:

$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"
)
Автор: user1978142 Размещён: 02.07.2014 01:15

1 плюс

1317 Репутация автора

Если с телефонными номерами возникла та же проблема, то это обход массива (без объектов!) Для приведения только числовых значений, не начинающихся с 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);
Автор: Sander Backus Размещён: 24.08.2015 12:17

-1 плюса

12371 Репутация автора

Что бы это ни стоило, у меня была похожая проблема в том, что у меня есть международные телефонные номера, начинающиеся с +символа. Я использовал urlencodeв своем телефонном номере строку, чтобы решить проблему:

$phone = urlencode( $phone );
Автор: Luke Размещён: 03.02.2016 11:41

3 плюса

31 Репутация автора

Вы можете попробовать это:

{
  "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);
Автор: Pablo Pixcasso Размещён: 15.11.2017 12:54

0 плюса

1 Репутация автора

передать данные в эту функцию, чтобы получить кодировку 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;
}
Автор: Dawn Dharmishtan Размещён: 13.06.2019 03:18
32x32