在 32 位系统上,一个数组可以有多达 4294967295 个元素(根据Artefacto在另一个线程上的帖子)。
但是,以intcount
形式返回元素数,在 32 位系统上,int 最多为 2147483647。
count
当一个数组有超过 2147483647 个元素时会返回什么?
首先,基于数组元素的大小的大小,您至少需要 163 GiB(32 位)或 309 GiB(64 位)的内存才能观察到这种行为。
的返回值count()
基于zend_hash_num_elements()
:
ZEND_API int zend_hash_num_elements(const HashTable *ht)
然后,此返回值long
在返回到您的代码之前被转换为 a;这会导致count()
返回一个看似负的值。这可以通过将其强制恢复为无符号值来解决:
$c = count($array_with_pow_2_32_elements);
echo $c; // -2147483648
printf("%u\n", $c); // 2147483648
或者:
$c = sprintf('%u', $c);
echo $c; // 2147483648