在PHP中处理大数

在PHP中处理大数,php,types,int,Php,Types,Int,几分钟后,我意识到了我遇到的错误:神奇的2147483647number,PHP/32上的integer类型的上限。我需要在我的功能中管理biggers编号: public function albumExists($name) // e.g. 104112826372452 { $albums = $this->getAlbums(); // If $name is int, search the key in $albums if(is_int($name) &am

几分钟后,我意识到了我遇到的错误:神奇的
2147483647
number,PHP/32上的
integer
类型的上限。我需要在我的功能中管理biggers编号:

public function albumExists($name) // e.g. 104112826372452
{
   $albums = $this->getAlbums();

   // If $name is int, search the key in $albums
   if(is_int($name) && ($found = array_key_exists($id = intval($name), $albums)))
      return ($found ? $id : false);

   // Start looking for $name as string
   foreach($album as $id => $a) if ($a->name == $name) return intval($id);

   return false; // Found nothing
}
以便能够通过
id
name
进行搜索。但是
intval()
将始终返回上限。如何处理相当大的数字,比如说,
104112826372452
?想法

编辑:用法示例:

$album = $fb->createAlbum('Test Album'); // Will return album id
// The use albumExists to check if id exists
$photo1 = $fb->uploadPhoto('mypic1.png', null, $album); 
$photo2 = $fb->uploadPhoto('mypic2.png', null, 'Test Album'); // find or create

int
有一个上限,较大的数字将表示为
浮点数
,这是不精确的,因此在这种情况下使用是不好的。如果需要对字符串进行计算,请使用
字符串
存储此类数字和扩展名。

int
具有上限,较大的数字将表示为
浮点数
,这是不精确的,因此在这种情况下使用是不明智的。如果需要对其进行计算,请使用
字符串
来存储这些数字和扩展名。

作为解决方法,您可以使用或函数来存储这些数字和扩展名

现在还不太清楚为什么您坚持强制转换为PHP整数。当不需要使用字符串计算时,只需将数据库编号保留为字符串即可。并非所有看起来像数字的东西都需要表示为数字


我想你真正的问题是与
is_int()
的区别。只需使用in-in-place,它可以处理任意长度的数字字符串,并且不依赖于整数强制转换值。

作为解决方法,您可以使用or函数

现在还不太清楚为什么您坚持强制转换为PHP整数。当不需要使用字符串计算时,只需将数据库编号保留为字符串即可。并非所有看起来像数字的东西都需要表示为数字

我想你真正的问题是与
is_int()
的区别。只需在其位置使用,它可以处理任意长度的数字字符串,并且不依赖于整数强制转换值。

不幸的是,PHP int type只能达到2147483647,但PHP float可以容纳高达100000000000的整数

查看php.net

更新

PHP.net说,浮点可以准确地容纳高达100000000000的整数。但我不确定浮点是否有上限。

不幸的是,PHP int type只能达到2147483647,但PHP float可以容纳高达100000000000的整数

查看php.net

更新


PHP.net说,浮点可以准确地容纳高达100000000000的整数。不过,我不确定float是否有上限。

一个选项是在
64位操作系统上运行PHP,因为输入大小由底层操作系统决定。这显然取决于您是否可以访问
64位
硬件,需要注意的一点是,这将比使用
gmp
/
bcmath
更快,但除非纯粹的速度是您的目标,否则这对您来说可能不会是一个问题

一个选项是在
64位
操作系统上运行PHP,因为其大小由底层操作系统决定。这显然取决于您是否可以访问
64位
硬件,需要注意的一点是,这将比使用
gmp
/
bcmath
更快,但除非您的目标是纯粹的速度,否则如果您出于理智的目的将其转换为int,则可能不会对您造成任何问题,也许您可以对其进行调整,使其完全基于数值而不是int数据类型进行计算:

if(ctype_digit($name) && ($found = array_key_exists($id = $name, $albums)))
      return ($found ? $id : false);
//etc
事实上,这也行吗

if(ctype_digit($name) && ($found = array_key_exists($name, $albums)))
      return ($found ? $name: false);
//etc

如果出于合理的目的(看起来是这样)将其转换为int,那么您可以调整它,使其仅基于数值而不是int数据类型对其求值:

if(ctype_digit($name) && ($found = array_key_exists($id = $name, $albums)))
      return ($found ? $id : false);
//etc
事实上,这也行吗

if(ctype_digit($name) && ($found = array_key_exists($name, $albums)))
      return ($found ? $name: false);
//etc

但是使用
字符串
我将无法同时提供id和名称搜索。。。我说得对吗?因为我可以向该函数传递唱片集名称或id。以字符串形式传递两者,我无法区分如何搜索。@Gremo您仍然可以检查名称是否只包含数字,或者您可以使API不那么模棱两可。但是使用
字符串
我将无法同时提供id和名称搜索。。。我说得对吗?因为我可以向该函数传递唱片集名称或id。将两者作为字符串传递,我无法区分如何搜索。@Gremo您仍然可以检查名称是否只包含数字,或者您可以使API不那么模棱两可。