当数组有超过2147483647个元素时,count的行为是什么?

时间:2013-07-28 19:09:53

标签: php arrays php-internals

在32位系统上,一个数组可以包含多达4294967295个元素(根据另一个线程上的Artefacto's post)。

但是,count将元素数作为 int 返回,而在32位系统上,int最多为2147483647。

当数组有超过2147483647个元素时,count会返回什么?

1 个答案:

答案 0 :(得分:7)

首先,根据array element的大小,您需要至少163 GiB(32位)或309 GiB(64位)的内存才能观察到此行为。

count()的返回值基于zend_hash_num_elements()

  

ZEND_API int zend_hash_num_elements(const HashTable *ht)

然后,在返回到代码之前,此返回值将被转换为long;这会导致count()返回看似负值的值。这可以通过强制它回到无符号值来修复:

$c = count($array_with_pow_2_32_elements);
echo $c; // -2147483648
printf("%u\n", $c); // 2147483648

或者:

$c = sprintf('%u', $c);
echo $c; // 2147483648