Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > PHP > Принудительный выход из цикла foreach |
Автор: salieri 20.03.17, 21:56 |
Доброго времени суток! Прочитал в интернете, что есть оператор break, но он почему-то выход не осуществляет. Ситуация следующая. Есть файл текстовый, содержимое которого загоняется в массив. Далее по циклу проходит, проверяет, чтобы введённое значение (почтовая форма) совпадало хотя бы с одним значением из этого массива. Если совпало, тут же выходим из цикла, но у меня так не вышло. Код прилагаю: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> $err=file("temp/err.txt"); foreach($err as $val) { if ( (stripos($name_edit, $val)) || (stripos($txt_edit, $val)) ) { $mess='Ссылки, имена сайтов и спецсимволы недопустимы!'; break; } } |
Автор: Dark Side 21.03.17, 09:49 |
А это именно break не работает или условие в цикле ни разу не выполняется? |
Автор: MIF 21.03.17, 10:29 |
Значит, не совпало. |
Автор: salieri 21.03.17, 16:53 |
условие как раз выполняется! и что интересно, когда цикл из 1 элемента, то всё работает, но тогда и break не нужен смысл такой, если 5-й элемент совпал, то дальше идти не надо, надо выходить из цикла, потому что если пойти дальше, то следующие могут не совпасть - и уже условие работать не будет. <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> $name_edit = 'иван'; $txt_edit = 'вася'; err.txt: вася коля петя |
Автор: Руслан 21.03.17, 19:46 |
Есть варик проверить, добавив $tmp_i=0; перед foreach $tmp_i++; перед break; ну и отображение $tmp_i после отработки - чисто убедиться, что больше одного раза прокрутился break; ? |
Автор: AVA12 21.03.17, 22:06 |
Автор: K313 22.03.17, 11:17 |
потому что stripos( ) у тебя всегда 0 или FALSE возвращает |
Автор: salieri 22.03.17, 15:16 |
Работает! Дело было в отсутствии этой строчки: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> $val=trim($val); из-за пробелов она не находила ничего, соответственно не совпадало break ни при чём оказался! Добавлено Всем огромное спасибо! Вывожу рабочий код: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> $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; } } |
Автор: Serafim 23.03.17, 13:58 |
А не проще просто возвращать нужную инфу об ошибках в момент нахождения и не грузить все данные в память? Ну типа такого, если образно: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> 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); } |