Выйти из внутреннего и внешнего цикла на php?
Всем привет. Есть два файла. Один с электронной почтой (А) и с каждым циклом этот файл увеличивается на одну почту. И надо отсеять, что бы не попали дубликаты. Отсеять ее позже нельзя, нужно сразу во время цикла.
И есть куча еще файлов(Б), откуда нужно взять эту почту, но там есть повторяющиеся и их надо отсеять, что они не попали в первый файл.
Как я делаю, но не получается.
file_get_content беру каждый раз в цикле получаю содержимое файлов А и Б. Все содержимое файла А разбиваю на массив через exploid и и сравниваю и полученной почтой из файла Б тоже в цикле foreach. То есть получается вложенный цикл. И если я встречаю во внутреннем цикле схожесть, то через continue выхожу из внутреннего цикла, но не из внешнего, что бы пропустить запись. Получился вот такой код:
foreach ($filee as $value) < // внешний цикл $text = file_get_contents(файл А); $result = file_get_contents('файл Б'); $pieces = explode("\n", $text); $pieces2 = explode("\n", $result); foreach ($pieces2 as $v) < // сравниваю в цикле найденные почты $vv = trim($v); if($vv == $pieces[0])< continue; // >// конец if > //конец внутреннего цикла //если не дубликат то записываю в файл > //конец внешнего цикла
Как мне не записывать дубликаты, как выйти из второго цикла?
- Вопрос задан более трёх лет назад
- 3008 просмотров
Комментировать
Решения вопроса 2
Igor Deyashkin @Lobotomist
Software Developer
Если отвечать конкрено на вопрос по выходу из цикла — нужно использовать конструкцию break
break 2
Но вообще твою задачу лучше решать другим способом. Если я правильно понимаю — у тебя есть много файлов, содержащих почтовые ящики и ты хочешь поместить все уникальные в один файл.
Судя по тому, что ты считаваешь файл с помощью fle_get_contents — у тебя не очень то большое количество ящиков. Я бы на твоем месте сделал так:
1. Создал бы ассоциативный массив, где в кач-ве ключей будут почтовые ящики
2. Прошелся бы по всем файлам, просто устанавливая соответствующим элементам массива какое-нибудь значение, например true.
3. Записал бы полученную информацию в файл.
Что-то типа этого (пишу без тестирования — просто чтобы показать принцип)
// Список файлов для обработки. Получить ты его можешь как угодно, например scandir. $files = ['/file1.txt', '/file2.txt']; $uniqueEmails = []; foreach ($files as $filePath) < $emails = file($filePath); foreach($emails as $email) < $email = trim($email); $uniqueEmails[$email] = true; >> $uniqueEmails = array_keys($uniqueEmails); $uniqueEmails = implode("\n", $uniqueEmails); file_put_contents('/out.txt', $uniqueEmails);
PHP циклы
В этой части учебника рассмотрим циклы в PHP 7, вы научитесь выходить из него и делать бесконечные циклы.
Для начала разберём, для чего вообще нужны циклы, всё очень просто, в первую очередь они нужны для того чтобы не повторять код, вот и всё.
PHP циклы:
В PHP есть несколько циклов, а конкретно четыре, сейчас мы все их рассмотрим.
Цикл while:
Этот цикл пожалуй самый простой из всех, вот его синтаксис.
$i = 0 ; // Создаём переменную и присваиваем ей ноль
// Пишем цикл while
while ( $i < 10 ) <
echo $i . ' ' ; // Выводим переменную $i
$i ++ ; // Увеличиваем переменную $i на один
Вот такой код получился, создаём переменную $i которую будим выводить на экран и увеличивать на один после каждой итерации цикла
(Итерация — один проход по циклу), после ключевого слова while в круглых скобках обязательно пишем условие при которых будет работать цикл, в нашем случае, пока $i не станет равен 10.
Вот что вывелось на экран.

Также, его можно записать в удобной форме для верстальщика.
$i = 0 ; // Создаём переменную и присваиваем ей ноль
// Пишем цикл while
while ( $i < 10 ) :
echo $i . ' ' ; // Выводим переменную $i
$i ++ ; // Увеличиваем переменную $i на один
Этот цикл достаточно популярен в PHP разработке, поэтому обязательно запомните его.
Благодаря этому циклу в PHP можно делать бесконечный цикл, что редко но бывает полезно, вот как он пишется.
$i = 0 ; // Создаём переменную и присваиваем ей ноль
// Пишем цикл while бесконечным
while ( true ) <
echo $i . ' ' ; // Выводим переменную $i
$i ++ ; // Увеличиваем переменную $i на один
Как видите, что бы сделать его бесконечным, достаточно только в условие цикла, написать true, вот что получилось.

Также ещё делают переменную, а в цикли условие, при каких обстоятельствах переменная будет меняться на false, и если она равно false, то цикл заканчивается, как это сделать будет ниже.
Цикл do while:
Этот цикл очень похож на предыдущий, единственное, обязательно хотя бы один раз произойдёт итерация, так как он проверяет условие после итерации, а не перед неё.
$i = 0 ; // Создаём переменную и присваиваем ей ноль
// Пишем цикл do while, в начале всегда пишем do
echo $i . ‘ ‘ ; // Выводим переменную $i
$i ++ ; // Увеличиваем переменную $i на один
> while ( $i < 10 ) ; // Условие пишется в конце цикла
Вид для верстальщиков у этого цикла нет, но и как показывает мой опыт, он редко используется, по крайне мере я его редко вижу, в основном вы будите использовать обычный while.
Цикл for:
Это наверное самый популярный цикл во многих языках программирования, но не в PHP, тем не менее, о нём рассказать надо.
// Пишем цикл for
for ( $i = 0 ; $i < 10 ; $i ++ ) <
echo $i . ' ' ; // Выводим переменную $i
Давайте разберём его, в начале в круглых скобках пишется переменная, которую будем увеличивать на один, потом переменная увеличиваться на один, идёт проверка чему в итоге равна она.
И так пока переменная не будет равна десяти, конечно, вам не обязательно создавать переменную или увеличивать её, вы можете вообще это не писать.
Также вы можете использовать другие операции и условия, к примеру, $i можете присвоит один и уменьшать её на один, пока переменная не будет равна нулю.
Ещё у этого цикла есть вид для верстальщиков.
PHP :: Операторы break, continue и goto
Как было показано выше, иногда может возникать необходимость в досрочном прекращении цикла. Для этого случая в PHP предусмотрен специальный оператор break , который широко используется не только во всех перечисленных циклах, но и в условном операторе switch . Более того, данный оператор может принимать необязательный числовой аргумент, который указывает интерпретатору на количество вложенных структур, которые необходимо прервать (см. рис. №1 ).
PHP Результат htmlCodes
> > /* Благодаря прерыванию сразу обоих циклов внешний цикл прервется уже в ходе выполнения первой итерации */ //Выведет 4 echo $k; ?>
Пример №1. Использование оператора break
Если бы в примере отсутствовал числовой аргумент 2 оператора break , то при достижении переменной $k значения 4 прервался бы только внутренний цикл. В результате внешний цикл смог бы продолжить свою работу, и в конечном итоге переменная $k достигла бы значения 9 . Измените код примера и посмотрите, как изменится результат.
Оператор continue
Когда нужно прервать не цикл, а только его текущую итерацию, используется оператор continue . Он также, как и оператор break , используется в циклах и операторе switch и может принимать необязательный числовой аргумент, указывающий интерпретатору на количество вложенных структур, текущие итерации которых требуется прервать (см. пример №2 ).
PHP Результат htmlCodes
//Из-за continue не будет выведено значение $k==4 echo $k; > //Из-за continue не будет выведено значение $i==1 echo $i; > ?>
Пример №2. Использование оператора continue
Оператор goto
Выйти из цикла можно также при помощи оператора goto , который используется для перехода в другую часть программы, помеченную специальной меткой в виде идентификатора и следующего за ним двоеточия (см. пример №3 ).
PHP Результат htmlCodes
//Задаем метку для перехода при помощи оператора goto var_1: echo '
'.'Сюда я перехожу из цикла'; //Переходим к следующей метке, пропуская промежуточный код goto var_2; //Этот код будет пропущен echo 'Я выведен не буду'; //Задаем еще одну метку для перехода при помощи оператора goto var_2: //Этот код будет выполнен echo '
'.'А вот меня покажут всем'; ?>
Пример №3. Использование оператора goto
Целевая метка должна находиться в том же файле и в том же контексте, что и оператор goto , указывающий на нее. Это означает, что нельзя переходить изнутри функции (метода) наружу или совершать обратный переход. Также недопустим переход извне внутрь любой циклической структуры или оператора switch .
Таким образом, основным предназначением оператора goto следует считать использование его в циклических структурах вместо многоуровневых операторов break .
Быстрый переход к другим страницам
- Цикл foreach в PHP
- Операторы break, continue и goto в PHP
- Понятие функции и ее синтаксис
- Вернуться к оглавлению учебника
![]()
html.okpython.net Copyright © 2016-2023.
Выход из бесконечного цикла
Выход из цикла
Всем привет! возникла проблема с циклом, не могу понять почему не работает код, а именно мне.
Принудительный выход из цикла for
Есть несколько вложеных циклов фор, как сделать принудительный выход из внутренего?
Принудительный выход из цикла foreach
Доброго времени суток! Прочитал в интернете, что есть оператор break, но он почему-то выход не.
Выход из бесконечного цикла
Как выйти из этого цикла при условии, что сгенерируется значение FAFZYMA2 while(true) .
Регистрация: 24.05.2011
Сообщений: 89
Ты запустил php файл с бесконечным циклом, то есть ты запустил процесс.
Получается чтобы его остановить его надо остановить «убить».
Следовательно тебе нужно написать класс который может как запустить этот файл отдельным процессом, так и остановить его.
Читай внимательно:
http://php.net//manual/ru/function.proc-open.php
http://php.net/manual/ru/function.proc-close.php
101 / 94 / 38
Регистрация: 30.09.2009
Сообщений: 437
попробуйте так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
$data = array( 'userNumber' => '+79654462668' ); $postdata = http_build_query($data); $options = array('http' => array( 'method' => 'POST', 'header' => 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'header' => 'Origin: http://wap', 'header' => 'User-Agent: Mozilla/5.0 (Windows NT 6.3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36 OPR/22.0.1471.70 (Edition Campaign 48)', 'header' => 'Content-Type: application/x-www-form-urlencoded', 'header' => 'DNT: 1', 'header' => 'Referer: http://wap.', 'header' => 'Accept-Encoding: gzip,deflate,lzma,sdch', 'header' => 'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4', 'header' => 'Cookie: ', 'content' => $postdata ) ); $context = stream_context_create($options); $f = fopen('conf_proc.txt', 'w'); fwrite($f, 'ok'); fclose($f); // while (true) while (file_get_contents('conf_proc.txt')=='ok') { $result = file_get_contents('http://wap.', false, $context); } ?>
для остановки вызовете фофрмой файл с содержанием:
1 2 3 4 5
$f = fopen('conf_proc.txt', 'w'); fwrite($f, 'no'); fclose($f); ?>
286 / 119 / 86
Регистрация: 14.05.2014
Сообщений: 767
Если не требуеться красивых решений можно просто сделать так.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
$data = array( 'userNumber' => '+79654462668' ); $postdata = http_build_query($data); $options = array('http' => array( 'method' => 'POST', 'header' => 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'header' => 'Origin: http://wap', 'header' => 'User-Agent: Mozilla/5.0 (Windows NT 6.3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36 OPR/22.0.1471.70 (Edition Campaign 48)', 'header' => 'Content-Type: application/x-www-form-urlencoded', 'header' => 'DNT: 1', 'header' => 'Referer: http://wap.', 'header' => 'Accept-Encoding: gzip,deflate,lzma,sdch', 'header' => 'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4', 'header' => 'Cookie: ', 'content' => $postdata ) ); $context = stream_context_create($options); while (true) { if(file_exists('stop.txt')) { break; } $result = file_get_contents('http://wap.', false, $context); }
