在PHP中处理大量数字

时间:2011-12-01 23:32:39

标签: php types int

几分钟后,我意识到我遇到的错误:魔术2147483647号码,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
}

为了能够按idname进行搜索。但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

5 个答案:

答案 0 :(得分:2)

作为解决方法,您可以使用gmpbcmath功能。

为什么你坚持要转换为PHP整数还不是很清楚。只需将数据库编号保留为字符串,不需要使用它们进行计算。并非所有看起来像数字的东西都需要表示为数字。

我猜你真正的问题是与is_int()的差异。只需在其位置使用is_numeric(),它可以使用任意长度的数字字符串,并且不依赖于整数转换值。

答案 1 :(得分:2)

如果你出于理智目的而转换为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

答案 2 :(得分:0)

int有一个上限,更大的数字将表示为floats,这些不精确,因此在这种情况下使用是个坏主意。如果您需要对其进行计算,请使用string来存储此类号码和BC Math扩展名。

答案 3 :(得分:0)

不可原谅的PHP int 类型最多只能达到2147483647但PHP float 可以保持整数高达10000000000000

查看php.net http://php.net/manual/en/language.types.integer.php

<强>更新

PHP.net说 float 可以准确地保存整数高达10000000000000.我不确定 float 是否有上限。

答案 4 :(得分:0)

一种选择是在64bit操作系统上运行PHP,因为其大小由底层操作系统决定。如果您可以访问64bit硬件,这显然是依赖的,有一点需要注意的是,这将比使用gmp / bcmath更快,但除非纯粹的速度是您的目标,否则它可能赢了对你来说不是问题