【问题标题】:What's the maximum number of keys for an array in phpphp中数组的最大键数是多少
【发布时间】:2010-09-15 08:06:22
【问题描述】:

我正在编写一个我调用的 php 脚本

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

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

print_r($lines);
exit;

该数组仅包含 7280 个元素。

所以我很好奇,WTF?数组可以拥有的键数量是否有限制?我在具有 2GB RAM 的双核 2.0Ghz 上本地运行它(虽然是 Vista 和 IIS);所以我有点困惑一个 4MB 的文件怎么会抛出这样的结果。

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

【问题讨论】:

  • 如果用count查看数组元素个数,是不是也只报7280?
  • (相关) HashTables

标签: php arrays


【解决方案1】:

两个建议:

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

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

【讨论】:

    【解决方案2】:

    PHP 的print_r 函数确实有限制。但是,即使您没有“看到”打印的整个数组,它也都在那里。在打印大型数据对象时,我也遇到过同样的问题。

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

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

    这应该可以让您不受限制地查看所有行。

    【讨论】:

      【解决方案3】:

      达里尔·海因,

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

      回应杰: 我跑了

      echo count($lines);
      

      我得到 105,546 的结果,但 print_r() 仍然只显示 7280。

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

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

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

      【讨论】:

      • 了解这一点非常有用。也许您可以将此作为社区拥有的答案,以便您接受它。
      • au.php.net/print_r 上有几个 print_r 的替代品应该可以正常工作(假设它是 print_r 的限制)
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          每次我用完 PHP 中的内存时,我都会收到一条错误消息,说明这一事实。所以,我还要说,如果你的内存不足,那么脚本就不会到达print_r()

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

          【讨论】:

            【解决方案7】:

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

            查看 php.ini 文件中的这一行,或许将其增加到 16 或更多。

            memory_limit = 8M
            

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

            php_value memory_limit 16M
            

            显然有些主机不允许您这样做。

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                【解决方案9】:

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

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

                【讨论】:

                  【解决方案10】:

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

                  【讨论】:

                  • 如果文件超过了内存限制,您难道不希望出现异常或其他情况吗?
                  • 并非如此。口译员会清理一切可能的东西,并停止任何额外的消费;除此之外,它可能会记录事件。
                  猜你喜欢
                  • 1970-01-01
                  • 2010-10-02
                  • 2013-01-09
                  • 2012-05-31
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-11-26
                  • 2010-10-14
                  • 2020-07-29
                  相关资源
                  最近更新 更多