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

Тема в разделе "PHP", создана пользователем saifu, 23 июн 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. saifu

    saifu

    Регистр.:
    13 фев 2008
    Сообщения:
    337
    Симпатии:
    38
    Плиз хелп ми. День уже с такой фигней маюсь.
    В общем есть 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]);
    }
    }
     
  2. tostrss

    tostrss

    Регистр.:
    16 окт 2007
    Сообщения:
    771
    Симпатии:
    217
    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++)
    т.к. незачем вычислять размер массива каждую итерацию
     
  3. saifu

    saifu

    Регистр.:
    13 фев 2008
    Сообщения:
    337
    Симпатии:
    38
    Не работает такой вариант - в файл ничего не пишется:(
     
  4. Mr.Emm

    Mr.Emm Постоялец

    Регистр.:
    5 май 2008
    Сообщения:
    145
    Симпатии:
    108
    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); 
    ?>
     
    saifu нравится это.
  5. Miraage

    Miraage Angular/Laravel

    Регистр.:
    3 июн 2008
    Сообщения:
    230
    Симпатии:
    51
    PHP:
    foreach ( $file as $line )
    {
       if ( 
    in_array$line ':8080'$file2 ))
       {
           
    fputs$file3$line );
       }
    }
     
    saifu нравится это.
  6. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    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]);
        }
    Массивы нужно сортировать, так как строки в файлах не совпадают.
     
    saifu нравится это.
  7. saifu

    saifu

    Регистр.:
    13 фев 2008
    Сообщения:
    337
    Симпатии:
    38
    В общем все поюзал результаты - работает вариант только у 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);
    ?>
     
  8. tostrss

    tostrss

    Регистр.:
    16 окт 2007
    Сообщения:
    771
    Симпатии:
    217
    Если во внешний цикл вынести валидные прокси, а во внутренний общий файл, то кол-во итераций будет меньше..это факт.

    кстати, зачем делить по ип и порт, если проще делать искать подстроку ип.
     
  9. Avadon

    Avadon Создатель

    Регистр.:
    21 июн 2009
    Сообщения:
    12
    Симпатии:
    1
    от перемены мест множителей произведение не меняется, т.е. 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($fileProxytrim($key))) { 
            
    fputs($file3$key);
        } 

     
  10. tostrss

    tostrss

    Регистр.:
    16 окт 2007
    Сообщения:
    771
    Симпатии:
    217
    согласен, погорячился....но брик, я бы поставил на внутренний цикл.
     
Статус темы:
Закрыта.