WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   PHP Hitta flera strängar i flera olika .txt filer (https://www.wn.se/forum/showthread.php?t=1062410)

Cos 2014-07-28 14:34

PHP Hitta flera strängar i flera olika .txt filer
 
Godag,

Sitter och felsöker ett problem med en systemintegration här. Jag har en lista på olika nummer i en .txt fil som jag vill försöka hitta i flera olika .txt filer.


PHP-kod:

<?php
$strings 
file(".\search_for.txt",FILE_IGNORE_NEW_LINES);

    foreach(
$strings as $searchfor) {
        
$directory './archive_backup';
        
$files array_diff(scandir($directory), array('..','.'));

            foreach(
$files as $file) {
            
$file "./archive_backup/" $file;

                
$contents file_get_contents($file);
                
$pattern preg_quote($searchfor'/');
                
$pattern "/^.*$pattern.*\$/m";
                    if(
preg_match_all($pattern$contents$matches)){
                        
                        
// ?!?!?
                        
                
} else {
                
                        
// ?!?!?

                
}
            }
    }
    
?>


Problemet jag brottas med här är att jag vet inte hur jag ska få till det för att endast printa ut de $searchfor -värden som inte hittas i någon av $file -filerna.

Som de ser ut just nu så kommer loopen att printa ut resultatet för varje loop för varje fil.

Vi talar flera tiotusentals värden att söka efter och lika många filer att söka igenom, så försöka mig på att lösa det med PHP.

Några idéer hur jag ska lösa det?

tec 2014-07-29 11:51

PHP-kod:

<?php
$strings 
file(".\search_for.txt"FILE_IGNORE_NEW_LINES);

foreach(
$strings as $key => $searchfor){
        
$directory './archive_backup';
        
$files array_diff(scandir($directory), array('..','.'));

        foreach(
$files as $file) { 
            
$file "./archive_backup/" $file;
            
$contents file_get_contents($file);
                
        
/*
        * kollar om $searchfor finns i $contents
        * !== false undviker att strpos missar $searchfor i början på strängen
        * strpos med inga träffar returnerar 0, strpos med träff från första tecken returnerar 0         
        */
        
if(strpos($contents$searchfor) !== false){  
          
// $searchfor finns i $contents och därmed i $file
                                  
           
unset($strings[$key]); // plocka bort värdet från högen(array) - endast de som inte hittas kommer att finnas kvar
           
break; // hoppa ur foreach($files as $file) // nuvarande $searchfor redan hittad - gå vidare på nästa                    
        
}
    }
}
echo 
'<pre>';
print_r($strings); // skriv ut de värden som inte har plockats bort
echo '</pre>';    
?>

Något sånt här borde fungera, byggde vidare på din kod. Ska det ske så effektivt som möjligt så bör alla nummer läsas in i en array som du sedan kör array_diff() på mot search_for-numrena. Är det extrema mängder så är array_diff_key() snabbare - kräver dock att du lägger numrena som keys i alla arrays.

Cos 2014-07-30 08:50

Snyggt. Tack för hjälpen!


Alla tider är GMT +2. Klockan är nu 08:32.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson