【问题标题】:Why does my PHP code doesn't work anymore for no reason?为什么我的 PHP 代码无缘无故不再工作了?
【发布时间】:2016-05-04 03:36:28
【问题描述】:

我的代码中有一个 for 循环。我已经有 5 到 6 天没有对这部分代码进行任何更改,而且我从来没有遇到过任何问题。

从昨天开始我尝试重新加载我的代码,它总是给我这个错误:

Maximum execution time of 30 seconds exceeded - in LogController.php line 270

好吧,我无法解释原因,但也许你们中的某个人可以查看一下。

这是我在第 270 行附近的代码。

$topten_sites = [];
for ($i = 0; $i <= count($sites_array); $i++) {
    if ($i < 10) { // this is 270
        $topten_sites[] = $sites_array[$i];
    }
}
$topten_sites = collect($topten_sites)->sortByDesc('number')->all();

正如我所说,它运行良好,为什么它给我一个错误?如果我取消注释这些行以及包含 $topten_sites 数组的所有其他行,代码将再次运行。

【问题讨论】:

  • 你的 for 循环中有些东西很奇怪,$i &lt;= $sites_array 部分。我觉得应该是$i &lt;= count($sites_array)
  • 我同意@PrinceG - 需要更改为count($sites_array)sizeof($sites_array)
  • 仅供参考 icosaedro.it/phplint 发现此错误。

标签: php for-loop


【解决方案1】:

这看起来不对:

    for ($i = 0; $i <= $sites_array; $i++) {
        if ($i < 10) { // this is 270
            $topten_sites[] = $sites_array[$i];
        }
    }

如果$sites_array 是一个数组,那么将它与一个整数进行比较是没有意义的,因此您可能会有一个永无止境的循环。

如果您只需要另一个数组中的前 10 个元素,您可以将循环替换为:

$topten_sites = array_slice($sites_array, 0, 10);

【讨论】:

  • 或者在你完成循环后使用 break 来终止循环
  • 更好。使用$i &lt;10 作为for 循环条件
  • 嗯.. 效果很好 o.o 谢谢!我不知道这个问题是怎么出现的,但是谢谢!
【解决方案2】:

如果只需要前 10 个结果,为什么要迭代整个数组?

    for ($i = 0; $i < 10; $i++) {
            $topten_sites[] = $sites_array[$i];
    }

【讨论】:

    【解决方案3】:

    回答实际答案;代码永远不会“无缘无故”地停止工作。代码有效或无效,都是有原因的。如果它停止工作 something 与您之前的测试相比发生了变化。 “有时有效,有时无效”属于同样的逻辑。代码每次的行为总是完全相同,只是部分参数发生了变化,你必须找到哪个。

    在你的情况下,我猜你的数组中的条目已经增加了。 PHP 和数组在速度方面不是最好的朋友,数组很慢。很可能是您的阵列是 当你测试它时它变小了(一开始可能不是最快的),但现在它刚刚达到 30 秒的阈值。

    也可能是这段代码之前的一部分代码需要很长时间(比如突然用了 28 秒而不是 20 秒),而您的循环(从未改变)在常规的 3 秒内完成了它的工作,现在遇到问题了

    【讨论】:

      【解决方案4】:

      像这样使用它:

          $topten_sites = [];
          for ($i = 0; $i <= 10; $i++) {
              $topten_sites[] = $sites_array[$i];
          }
          $topten_sites = collect($topten_sites)->sortByDesc('number')->all();
      

      【讨论】:

      • 为什么 OP 应该“试试这个”? 好的答案将始终解释所做的事情以及这样做的原因,不仅适用于 OP,也适用于 SO 的未来访问者。
      猜你喜欢
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      相关资源
      最近更新 更多