@Kirill-Gorelov
С ума с IT

Выйти из внутреннего и внешнего цикла на 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
} //конец внутреннего цикла
//если не дубликат то записываю в файл
} //конец внешнего цикла

Как мне не записывать дубликаты, как выйти из второго цикла?
  • Вопрос задан
  • 3227 просмотров
Решения вопроса 2
Lobotomist
@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);
Ответ написан
@lament
Но есть же удобная функция - array_search.
Пример:
<?php
$array = array(1 => '111', 2 => '222', 3 => '333', 4 => '444', 5 => '555');

$array_2 = array(0 => 'aaa', 1 => 'bbb', 2 => '555', 3 => 'eee', 4 => 'fff', 5 => '333', 6 => 'qqq', 7 => '111', 8 => 'rrr', 9 => 'ttt', 10 => '333');

$i = 0;
$stop = count($array_2);
while ($i != $stop) {
	$now = $array_2[$i];
	$temp = array_search ($now, $array, TRUE); 
	if ($temp) {
		echo "Совпадение найдено, пропускаем - ".$now."<br>";
	} else {
		echo "Совпадений не найдено, записываем в массив array - ".$now."<br>";
		$array [] = $now;
	}
	$i++;
}
?>
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
VladimirAndreev
@VladimirAndreev
php web dev
while(true){
    while(true){
        break(2);
    }
}
Ответ написан
Комментировать
alsopub
@alsopub
Выход из цикла как таковой - break
Выход из двух циклов - либо while (...) { ... $exit2 = true; break; } if ($exit2) { break; }
Либо уж goto, не думаю что он тут что-то сильно испортит.
Ответ написан
@CodeKeeper
Symfony/Magento developer
Самое появление решения с двумя циклами должно настораживать. Выше уже порекомендовали array_search, но если тебе нужно найти разницу двух массивов то используй array_diff
Ответ написан
Комментировать
skobkin
@skobkin
Гентушник, разработчик на PHP и Symfony.
break 2;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы