2

在 32 位系统上,一个数组可以有多达 4294967295 个元素(根据Artefacto在另一个线程上的帖子)。

但是,以intcount形式返回元素数,在 32 位系统上,int 最多为 2147483647。

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

4

1 回答 1

7

首先,基于数组元素的大小的大小,您至少需要 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
于 2013-07-29T07:07:29.467 回答