Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.221.187.121] |
|
Сообщ.
#1
,
|
|
|
Доброго времени суток! Прочитал в интернете, что есть оператор break, но он почему-то выход не осуществляет.
Ситуация следующая. Есть файл текстовый, содержимое которого загоняется в массив. Далее по циклу проходит, проверяет, чтобы введённое значение (почтовая форма) совпадало хотя бы с одним значением из этого массива. Если совпало, тут же выходим из цикла, но у меня так не вышло. Код прилагаю: $err=file("temp/err.txt"); foreach($err as $val) { if ( (stripos($name_edit, $val)) || (stripos($txt_edit, $val)) ) { $mess='Ссылки, имена сайтов и спецсимволы недопустимы!'; break; } } |
Сообщ.
#2
,
|
|
|
А это именно break не работает или условие в цикле ни разу не выполняется?
|
Сообщ.
#3
,
|
|
|
Значит, не совпало.
|
Сообщ.
#4
,
|
|
|
Цитата Dark Side @ А это именно break не работает или условие в цикле ни разу не выполняется? условие как раз выполняется! и что интересно, когда цикл из 1 элемента, то всё работает, но тогда и break не нужен смысл такой, если 5-й элемент совпал, то дальше идти не надо, надо выходить из цикла, потому что если пойти дальше, то следующие могут не совпасть - и уже условие работать не будет. $name_edit = 'иван'; $txt_edit = 'вася'; err.txt: вася коля петя |
Сообщ.
#5
,
|
|
|
Цитата salieri @ условие как раз выполняется! Есть варик проверить, добавив $tmp_i=0; перед foreach $tmp_i++; перед break; ну и отображение $tmp_i после отработки - чисто убедиться, что больше одного раза прокрутился break; ? |
Сообщ.
#6
,
|
|
|
|
Сообщ.
#7
,
|
|
|
Цитата AVA12 @ потому что stripos( ) у тебя всегда 0 или FALSE возвращает |
Сообщ.
#8
,
|
|
|
Работает! Дело было в отсутствии этой строчки:
$val=trim($val); из-за пробелов она не находила ничего, соответственно не совпадало break ни при чём оказался! Добавлено Всем огромное спасибо! Вывожу рабочий код: $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; } } |
Сообщ.
#9
,
|
|
|
А не проще просто возвращать нужную инфу об ошибках в момент нахождения и не грузить все данные в память? Ну типа такого, если образно:
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); } |