Как прервать цикл foreach из сеанса XDebug?

У меня есть цикл foreach, который занимает много времени:

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

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

При отладке этого я стараюсь избегать итерации всех их элементов, поэтому я часто пишу escape-код по строкам:

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

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

И, как отмечается в комментарии, нечто подобное когда-то появилось, и я почувствовал себя любителем.

Есть ли способ сломать foreach цикл из сеанса XDebug без написания кода var_dumpy? В качестве IDE я использую PhpStorm.

2

Решение

Я не нашел способа разорвать цикл foreach на лету, но лучшее, что можно сделать, это уменьшить размер массива на лету.

  • Установите точку останова после настройки массива, в лучшем случае до начала цикла. (Он также работает внутри цикла, но может иметь странное поведение)
  • Выбрать Evaluate expression Окно отладки или использование ярлыка phpstorm, по умолчанию должно быть Alt + сдвиг + 8
  • бежать $someHugeArray = array_slice($someHugeArray, $offset = 0, $length = 10);

Кроме того array_slice можно также использовать array_filter если кто-то хочет фильтровать по более конкретным условиям, используя замыкание.

Теперь у вас есть небольшой массив, вы можете наслаждаться быстрым временем выполнения, не беспокоясь о том, чтобы очиститься после сеанса отладки.

3

Другие решения

Это прервет цикл на 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
}
0