Поиск соответсвий в массиве

Статус
В этой теме нельзя размещать новые ответы.

saifu

Профессор
Регистрация
13 Фев 2008
Сообщения
337
Реакции
39
Плиз хелп ми. День уже с такой фигней маюсь.
В общем есть 2 файла с проксями -в одном прокси записаны с портами
в другом без. Для наглядности
proxy.txt
81.180.75.142:8080
114.127.246.36:8080
122.138.14.150:8080
124.124.66.97:8080
87.193.176.243:80
124.247.225.150:8080
и
goodproxy.txt
122.138.14.150
10.198.1.23
129.82.12.188
81.180.75.142
87.193.176.243
189.19.43.76
И мне нужно организовать поиск соответствий каждой строки файла goodproxy.txt по всему файлу proxy.txt и если совпадение найдется записать его в файл.
Проверка на соотвествие каждой отдельной строчки легко решается
с помощью strpos а как быть если нужно проверять не строгое совпадение строки по всему массиву?
Вот примерно как соответствие каждой отдельной строки в массивах смотрю.
PHP:
$file=file("proxy.txt");
$file2=file("goodproxy.txt");
$file3=fopen("result.txt","w");
 for ($i=0;$i<count($file2);$i++)
 {
$string[$i] = strpos($file[$i], $file2[$i]);
if(!empty($string[$i]))
{fputs ($file3,$file[$i]);
}
}
 
PHP:
if (false !== strpos($file[$i], $file2[$i])) {
    fputs ($file3, $file[$i]);
}

PHP:
for ($i=0;$i<count($file2);$i++)

лучше заменить на
PHP:
for ($i=0, $count = sizeof($file2); $i < $count; $i++)

т.к. незачем вычислять размер массива каждую итерацию
 
Не работает такой вариант - в файл ничего не пишется:(
 
PHP:
<?php
$file=file("proxy.txt");
$file2=file("goodproxy.txt");
$file3=fopen("result.txt","w");

 for($i=0, $count = sizeof($file); $i < $count; $i++)
 {

 if(false !== strpos($file[$i], ':')) {
  list($ip[], $p[]) = split(':', $file[$i]);
   } else {
   $ip[$i] = $file[$i];
   }
   
   foreach($file2 as $key) {
     if(trim($ip[$i]) == trim($key))
       { fputs($file3, $file[$i]); }
         }
   
 } 
fclose($file3); 
?>
 
PHP:
foreach ( $file as $line )
{
   if ( in_array( $line . ':8080', $file2 ))
   {
       fputs( $file3, $line );
   }
}
 
Mr.Emm, извращенец однако :)
Miraage, по твоему все прокси работают на одном порту? :D

PHP:
$file = file("proxy.txt");
$file2 = file("goodproxy.txt");
$file3 = fopen("result.txt","w");

sort($file);
sort($file2);

$size = count($file2);
for ($i = 0; $i < $size; $i++) {
	if(strpos(trim($file[$i]), trim($file2[$i])) !== false) {
		fputs($file3,$file[$i]);
	}
}

Массивы нужно сортировать, так как строки в файлах не совпадают.
 
В общем все поюзал результаты - работает вариант только у Mr.Emm за что ему персональный респект. PHP_Master ваш вариант бы работал если бы число элементов 2 массивов было бы одинаково (а оно разное будет - совсем забыл сказать, просто из примера не видно). У Miraage код не работает, не отбирает даже с вхождением ':8080' - in_array же кажись для строгого соответсвия работает? Ну и в моем случае мне надо еще на дубликаты файл goodproxy.txt почистить (особенности парсинга, чекинга прокси:))
В общем полный код вот такой у меня получился:
PHP:
<?php
$file=file("proxy.txt");
$file2=file("goodproxy.txt");
$file3=fopen("result.txt","w");


$result = array_unique($file2);
file_put_contents('goodproxyclear.txt', implode("",$result));

$file4=file("goodproxyclear.txt");

 for($i=0, $count = sizeof($file); $i < $count; $i++)
 {

 if(false !== strpos($file[$i], ':')) {
  list($ip[], $p[]) = split(':', $file[$i]);
   } else {
   $ip[$i] = $file[$i];
   }

   foreach($file4 as $key) {
     if(trim($ip[$i]) == trim($key))
       { fputs($file3, $file[$i]); }
         }

 }
fclose($file3);
?>
 
Если во внешний цикл вынести валидные прокси, а во внутренний общий файл, то кол-во итераций будет меньше..это факт.

кстати, зачем делить по ип и порт, если проще делать искать подстроку ип.
 
Если во внешний цикл вынести валидные прокси, а во внутренний общий файл, то кол-во итераций будет меньше..это факт.
от перемены мест множителей произведение не меняется, т.е. 100*200===200*100
кстати, зачем делить по ип и порт, если проще делать искать подстроку ип.
а вот с этим согласен
PHP:
for($i=0, $count=sizeof($file); $i<$count; $i++) { 
	foreach($file4 as $key) { 
		if(false!==strpos($file[$i], trim($key))) { 
			fputs($file3, $file[$i]);
		} 
	} 
}
Если бы инфа о портах не нужна была в новом файле, то можно было бы обойтись и одним циклом:
PHP:
$fileProxy=file_get_contents('proxy.txt');
...
foreach($file4 as $key) { 
	if(false!==strpos($fileProxy, trim($key))) { 
		fputs($file3, $key);
	} 
}
 
от перемены мест множителей произведение не меняется, т.е. 100*200===200*100

согласен, погорячился....но брик, я бы поставил на внутренний цикл.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху