Число строк в целое число не работает PHP

Я пытаюсь преобразовать строковое число в целое число, но оно работает не так, как ожидалось, вот код проблемы:

$usage['msisdn'] = "46720000000";
$usage['msisdn'] = (int)$usage['msisdn'];

echo $usage['msisdn'];

Он повторяет 2147483647 как целое число, но я хочу получить 46720000000 как целое число.
Что не так?

Кстати, я разбираю данные с помощью json_encode ();


ОБНОВЛЕНИЕ: Да ладно, у меня это для работы с intval ()


person Hassan Ila    schedule 16.12.2015    source источник


Ответы (2)


Это потому, что максимальное значение int32 равно 2 147 483 647. Ваш номер телефона превышает это значение.

Вы можете найти максимальное значение int на своем сервере, используя:

echo PHP_INT_MAX;

Я считаю, что хранить номер телефона как целое число - плохая практика, и это может повлиять на вас позже. Почему? Поскольку номер телефона может начинаться с:

  • IDD: 00 или +
  • NDD: 0

Кроме того, вы можете в какой-то момент отформатировать номер телефона, сохранив его в виде строки, что значительно упростит эту часть.

Рождественский бонус :) libphonenumber-for-php

person Mihai Matei    schedule 16.12.2015
comment
Как мне тогда это исправить ?? - person Hassan Ila; 16.12.2015
comment
Единственный способ - обновить сервер до 64-битной ОС и HW. Я предлагаю вам сохранить номера телефонов в виде строк. Фактически, номер телефона представляет собой строку, потому что он может начинаться с IDD 00, + или NDD 0, либо код страны также может начинаться с 0. Кроме того, сохранение его в виде строки может помочь, если вы хотите отформатировать номер телефона. - person Mihai Matei; 16.12.2015
comment
Отредактировал мой ответ чуть выше, поскольку вы не можете легко изменить значение max_int, вместо этого вы можете попробовать использовать преобразование в float. - person Nirnae; 16.12.2015
comment
Спасибо @MateiMihai Я не знала, что лучше хранить тел. числа в виде строк. Теперь пусть это будет просто строка :) - person Hassan Ila; 16.12.2015
comment
Спасибо также за рождественский бонус;) @MateiMihai - person Hassan Ila; 16.12.2015

Ваш код не работает, потому что строка преобразования в int является максимальным значением в зависимости от вашей системы, как указано в документации:

Максимальное значение зависит от системы. 32-битные системы имеют максимальный диапазон целых чисел со знаком от -2147483648 до 2147483647. Так, например, в такой системе intval ('1000000000000') вернет 2147483647. Максимальное целочисленное значение со знаком для 64-битных систем составляет 9223372036854775807.

Источник: http://php.net/manual/en/function.intval.php

Поскольку вы не можете легко изменить значение max_int, вы можете попробовать вместо этого использовать преобразование в float.

$usage['msisdn']  = floatval($usage['msisdn']);
person Nirnae    schedule 16.12.2015