在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不那么模棱两可。