Nano Hash - криптовалюты, майнинг, программирование

Прервите первый цикл и продолжите следующий цикл, если это правда

У меня есть цикл foreach внутри другого цикла foreach в виде этого кода:

foreach($array1 as $uid => $somevalues) {

  $status = true;
  foreach($somevalues as $somevalue)
    if(!isset($somevalue->$someothervalue))
      $status = false;

  if($status) {
    $content .= "some content added";
    $count++;
  }
}

Как это работает

Как видите, я перебираю все записи в $array1. Для каждой записи я перебираю содержащийся в ней массив $somevalues в поисках определенного условия (там существует $someothervalue). Теперь, если это условие (что-то isset) неверно, то $status меняется на false.

Только если $status все еще верно после всех циклов внутреннего foreach, я хочу, чтобы было выполнено какое-то действие (некоторое содержимое добавлено в текстовую строку $content и повышенный счетчик).

Цель

Массивы, с которыми я работаю, могут быть довольно большими, и я рассматривал команды break и continue, чтобы попытаться пропустить ненужные части, чтобы улучшить код и сократить количество циклов выполнения скрипта.

Как видите, если цикл из внутреннего foreach приводит к $status=false, то мы можем остановить его прямо здесь (дальнейшие циклы здесь не нужны). break подходит для того, чтобы пропустить остальные forearch петель.

Если это так, то мы также можем пропустить оставшуюся часть текущего внешнего цикла из внешнего foreach, поскольку теперь не будет выполняться никакой код, поскольку $status равен false. Для этой цели была бы полезна команда continue, позволяющая пропустить оставшуюся часть текущего внешнего цикла и сразу перейти к следующей строке массива.

Вопрос

Я смотрел на командные строки break 2 и continue 2, например. которые позволяют пропустить текущий И внешний цикл (на два шага вверх) с соответствующими результатами (либо полностью остановить цикл, либо пропустить оставшуюся часть текущего цикла). Они работают как двойной разрыв — как «break break» — и как двойное продолжение — как «continue continue» — соответственно.

Но здесь мне нужно что-то вроде break continue, если вы меня понимаете. Первый цикл должен break, следующий должен continue. Я пытаюсь избежать использования оператора if в коде, если в этом нет необходимости. Проверка уже сделана, и это похоже на ненужную двойную проверку.

Надеюсь вопрос ясен. Есть ли для этой цели метод двойного пропуска изнутри внутреннего foreach, но с эффектом двух разных команд break continue?


  • Проблема в том, что когда вы выходите из внутреннего цикла, вы не знаете, почему он остановился. Было ли это потому, что вы пробежали весь массив или потому что вы достигли оператора break? Поэтому вам нужно сделать вторую проверку вне внутреннего цикла, чтобы выяснить, какое действие предпринять. Теперь я думаю, что с помощью итераций вы можете достичь эффекта продолжения перерыва, как вы сказали. 13.09.2014
  • Другой подход — использовать внешнюю функцию для запуска внутреннего цикла и просто возвращать false, когда ваше значение не установлено. Но функции могут стоить слишком дорого, учитывая, что вы сказали, что ваш массив содержит несколько элементов, а производительность имеет первостепенное значение. 13.09.2014
  • Спасибо, @Vinicius Barros. Да, создать функцию для отлова возврата — это то, о чем я не подумал. Но это может быть слишком тяжело по сравнению с простым сохранением текущего пути if, как вы упомянули. 13.09.2014

Ответы:


1

Переменные «флаг» — это в основном запах кода и указание на то, что вам действительно следует использовать функцию:

function all_valid($somevalues) {
    foreach($somevalues as $somevalue)
       if(!isset($somevalue->$someothervalue))
           return false;
    return true;
}


foreach($array1 as $uid => $somevalues) {
    if(all_valid($somevalues) {
        do stuff

Если вы готовы пожертвовать читабельностью ради производительности, то как насчет:

foreach($array1 as $uid => $somevalues) {

    foreach($somevalues as $somevalue)
        if(!isset($somevalue->$someothervalue))
            goto next; // I don't believe I wrote this

    $content .= "some content added";
    $count++;

    next:
}
13.09.2014

2

Просто используйте continue 2, он выведет break из первого цикла и continue из внешнего цикла.

foreach([1, 2, 3] as $i) {
    echo $i . PHP_EOL;

    foreach([4, 5, 6] as $ii) {
        continue 2;
    }

    echo 'this will never print' . PHP_EOL;
}

Будет печатать:

1
2
3
19.01.2017

3
  • continue 2 определяет, цикл продолжится со второго уровня. Чем определить, что тормозит этот цикл. Таким образом, после разрыва 2-го цикла (1-й уровень) он перейдет к 1-му циклу (2-й уровень), а затем продолжит работу, как это определено для 2-го уровня. и это работает 07.10.2020
  • Спасибо, не хочу быть грубым, но на этом сайте есть ответы на некоторые вопросы. Я рекомендую это прочитать здесь 08.10.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..