Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.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
Цитата Dark Side @
А это именно break не работает или условие в цикле ни разу не выполняется?

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

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    $name_edit = 'иван';
    $txt_edit = 'вася';


err.txt:
вася
коля
петя

Автор: Руслан 21.03.17, 19:46
Цитата salieri @
условие как раз выполняется!

Есть варик проверить, добавив
$tmp_i=0; перед foreach
$tmp_i++; перед break;
ну и отображение $tmp_i после отработки - чисто убедиться, что больше одного раза прокрутился break; :rolleyes:
?

Автор: AVA12 21.03.17, 22:06
:popcorn:

Автор: K313 22.03.17, 11:17
Цитата AVA12 @
:popcorn:
потому что 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);
    }

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)