如何从 XDebug 会话中中断 foreach 循环?

How to break foreach loop from a XDebug session?

我有一个 foreach 循环,它正在做一些耗时的事情:

$someHugeArray = [...]; // having beyond 300 to 1000 items

foreach ($someHugeArray as $item) {
    $this->applyTimeConsumingMagic($item);
}

调试时我尽量避免重复所有项目,所以我经常按照以下行编写转义代码:

foreach ($someHugeArray as $i => $item) {
    $this->applyTimeConsumingMagic($item);

    if ($i > 10) { break; } // @fixme: should not go live
}

正如评论所指出的那样,这样的事情曾经上线过,让我觉得自己像个业余爱好者。

有没有什么方法可以在不编写 var_dumpy 代码的情况下从 XDebug 会话中中断 foreach 循环?作为 IDE 我使用 PhpStorm。

我没有找到即时中断 foreach 循环的方法,但接下来最好的办法就是即时减小数组大小。

  • 设置数组后设置断点,最好在循环开始之前设置。 (它也在循环内工作,但可能会有奇怪的行为)
  • Select Evaluate expression phpstorm 的调试 window 或使用快捷方式,默认应该是 Alt + Shift + 8
  • 运行 $someHugeArray = array_slice($someHugeArray, $offset = 0, $length = 10);

此外 array_slice one could also use array_filter 如果您想使用闭包按更具体的条件进行过滤。

现在你有一个小数组,享受快速执行时间,而不必担心在调试会话后进行清理。

这将在 10 日打破循环 运行 通过 - 但显然可以设置为 2 或 3 等:

$myArray = $this->getHugeDataArray();
$i       = 0; //here we set i to 0 so we can count to 10

foreach ($myArray as $key => $value)
{
    $i++;
    if ($i == 9) {break;}

    //rest of actual code
}