什么是PHP中数组的最大键数

时间:2008-10-05 01:04:43

标签: php arrays

我正在写一个PHP脚本,我打电话给

$lines = file('base_list.txt');

将文件分解为数组。该文件中有超过100,000行,这应该是数组中的100,000个元素,但是当我运行

print_r($lines);
exit;

该数组仅包含7280个元素。

所以我很好奇,WTF?数组可以拥有的密钥数量是否有限制?我在本地运行这款双核2.0Ghz,配备2GB内存(Vista和IIS虽然);所以我有点困惑4MB文件如何抛出这样的结果。

编辑: 我可能应该提到我之前在php.ini中也将memory_limit设置为512MB。

10 个答案:

答案 0 :(得分:5)

达里尔海因,

是的,错误日志中没有任何内容。我甚至增加了错误报告,但仍与print_r()无关。

回应周杰伦: 我跑了

echo count($lines);

我得到105,546的结果但是print_r()只显示7280.

采取Rob Walker的建议我循环遍历数组中的所有元素,它实际上包含了所有结果。这让我相信问题在于print_r()本身而不是对数组大小的限制。

另一个奇怪的事情是我在我的一个REHL服务器上尝试了它,结果是应该的。现在我不想把它归咎于Windows / IIS,但你去了。

考虑到上述情况,我认为这个问题应该重新命名,因为它不再与数组相关,而是print_r。

答案 1 :(得分:4)

编辑:正如Rob所说,如果您的应用程序内存不足,很可能无法进入print_r行。这也是我的预感,但如果 是内存问题,以下内容可能有所帮助。

在php.ini文件中查看此行,并可能将其增加到16或更多。

memory_limit = 8M

如果您无法访问php.ini(例如,如果这种情况发生在共享服务器上),您可以使用.htaccess这样的文件进行修复

php_value memory_limit 16M

显然有些主持人不允许你这样做。

答案 2 :(得分:2)

print_r的输出是否存在固有限制?我建议在文件中查找第一行和最后一行,看看它们是否在数组中。如果您在插入数组时遇到了内存限制,那么您将永远无法访问print_r行。

答案 3 :(得分:2)

两个建议:

  1. 计算数组中的实际项目数,并查看数组是否是正确的条目数(因此消除或识别print_r()为罪魁祸首)

  2. 验证输入...文件中的行结尾是否有可能导致问题?例如,是否有不同类型的行结尾的混合?请参阅manual page for file()以及有关auto_detect_line_endings设置的说明,但这不太可能与mac行结尾有关。

答案 4 :(得分:1)

我相信它是基于php.ini文件中设置的可用内存量。

答案 5 :(得分:1)

每次我在PHP中耗尽内存时,我都会收到一条错误消息,说明这一事实。所以,我也会说,如果你的内存不足,那么脚本就不会进入print_r()

尝试在php.ini中启用auto_detect_line_endings或使用
ini_set('auto_detect_line_endings', 1)。可能存在窗口不理解的一些行结尾&这个ini选项可能有所帮助。有关此ini选项的更多信息,请访问here

答案 6 :(得分:1)

您应该使用count来计算数组中的项目数,而不是print_r。如果由于超时或其他原因导致此大型数组的输出中止,该怎么办?或print_r中的一些错误/功能?

答案 7 :(得分:1)

PHP的print_r函数确实有局限性。然而,即使你没有“看到”整个阵列打印,它就在那里。打印大型数据对象时,我一直在努力解决同样的问题。

它使调试变得困难,如果你必须看到整个数组,你可以创建一个循环来打印每一行。

foreach ($FileLines as $Line) echo $Line;

这应该让你看到所有的限制线。

答案 8 :(得分:0)

我会同意科里。我认为您的PHP可能配置为8MB的默认内存,其中4MB x 2已经更多。 x2的原因是因为你必须加载文件,然后创建你需要再次将文件存储在内存中的数组。我只是猜测,但这是有道理的。

你确定PHP没有记录错误吗?

答案 9 :(得分:0)

如果您输出的内容类似于Internet Explorer,您可能需要确保它可以显示您尝试放置的所有信息。我知道html页面有限制,但我不确定它是什么。