在32位系统上,一个数组可以包含多达4294967295个元素(根据另一个线程上的Artefacto's post)。
但是,count
将元素数作为 int 返回,而在32位系统上,int最多为2147483647。
当数组有超过2147483647个元素时,count
会返回什么?
答案 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