На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Serafim, fatalist
  
    > Принудительный выход из цикла foreach , по условию
      Доброго времени суток! Прочитал в интернете, что есть оператор break, но он почему-то выход не осуществляет.
      Ситуация следующая. Есть файл текстовый, содержимое которого загоняется в массив. Далее по циклу проходит, проверяет, чтобы введённое значение (почтовая форма) совпадало хотя бы с одним значением из этого массива. Если совпало, тут же выходим из цикла, но у меня так не вышло. Код прилагаю:

      ExpandedWrap disabled
        $err=file("temp/err.txt");
         
        foreach($err as $val)
         
        {
         
        if ( (stripos($name_edit, $val)) || (stripos($txt_edit, $val)) )
        {
        $mess='Ссылки, имена сайтов и спецсимволы недопустимы!';
        break;
        }
         
        }
        А это именно break не работает или условие в цикле ни разу не выполняется?
          Значит, не совпало.
            Цитата Dark Side @
            А это именно break не работает или условие в цикле ни разу не выполняется?

            условие как раз выполняется!
            и что интересно, когда цикл из 1 элемента, то всё работает, но тогда и break не нужен
            смысл такой, если 5-й элемент совпал, то дальше идти не надо, надо выходить из цикла, потому что если пойти дальше, то следующие могут не совпасть - и уже условие работать не будет.

            ExpandedWrap disabled
              $name_edit = 'иван';
              $txt_edit = 'вася';


            err.txt:
            вася
            коля
            петя
            Сообщение отредактировано: salieri -
              Цитата salieri @
              условие как раз выполняется!

              Есть варик проверить, добавив
              $tmp_i=0; перед foreach
              $tmp_i++; перед break;
              ну и отображение $tmp_i после отработки - чисто убедиться, что больше одного раза прокрутился break; :rolleyes:
              ?
              Сообщение отредактировано: Руслан -
                :popcorn:
                  Цитата AVA12 @
                  :popcorn:
                  потому что stripos( ) у тебя всегда 0 или FALSE возвращает
                  Сообщение отредактировано: K313 -
                    Работает! Дело было в отсутствии этой строчки:
                    ExpandedWrap disabled
                      $val=trim($val);


                    из-за пробелов она не находила ничего, соответственно не совпадало
                    break ни при чём оказался!

                    Добавлено
                    Всем огромное спасибо!

                    Вывожу рабочий код:

                    ExpandedWrap disabled
                      $err=file("temp/err.txt");
                       
                      foreach($err as $val)
                       
                      {
                      $val=trim($val);
                       
                      if(stripos($name_edit, $val) !== false || stripos($txt_edit, $val) !== false)
                       
                      {
                      $mess='Ссылки, имена сайтов и спецсимволы недопустимы!';
                      break;
                      }
                       
                      }
                      А не проще просто возвращать нужную инфу об ошибках в момент нахождения и не грузить все данные в память? Ну типа такого, если образно:

                      ExpandedWrap disabled
                        function contains(string $haystack, string ...$needles): bool
                        {
                            foreach ($needles as $needle) {
                                if ($needle != '' && mb_strpos($haystack, $needle) !== false) {
                                    return true;
                                }
                            }
                         
                            return false;
                        }
                         
                        // ....
                         
                        function get_errors(string $name_edit, string $txt_edit): \Generator
                        {
                            $fp = fopen(__DIR__ . '/temp/err.txt', 'rb');
                         
                            while (!feof($fp)) {
                                if (contains(fgets($fp), $name_edit, $txt_edit)) {
                                    yield 'Ссылки, имена сайтов и спецсимволы недопустимы!';
                                }
                            }
                         
                            return fclose($fp);
                        }
                      Сообщение отредактировано: Serafim -
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0270 ]   [ 15 queries used ]   [ Generated: 28.03.24, 19:16 GMT ]