几分钟后,我意识到我遇到的错误:魔术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
}
为了能够按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
答案 0 :(得分:2)
为什么你坚持要转换为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
更快,但除非纯粹的速度是您的目标,否则它可能赢了对你来说不是问题