2010-11-04 5 views
1

Hé les gars, j'ai eu beaucoup d'aide de tout le monde ici et je suis vraiment reconnaissant! J'essaie de créer un moteur de recherche de fichiers texte et je pense que je suis sur le dernier tronçon maintenant! Tout ce que je dois faire maintenant est d'être capable de chercher le tableau multidimensionnel que j'ai créé pour un certain mot soumis par un formulaire et attrapé avec GET, et retourner les résultats dans l'ordre le plus élevé (TF-IDF viendra plus tard). Je peux effectuer une recherche simple sur la variable de contenu qui n'est pas vraiment ce que je veux (voir dans le code pour $ new_content) mais pas sur le tableau $ index.Comment rechercher un tableau multidimensionnel en utilisant GET

Voici mon code:

<?php 
$starttime = microtime(); 
$startarray = explode(" ", $starttime); 
$starttime = $startarray[1] + $startarray[0]; 

if(isset($_GET['search'])) 
{ 
    $searchWord = $_GET['search']; 
} 
else 
{ 
    $searchWord = null; 
} 

?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<title>Untitled Document</title> 
</head> 

<body> 
<div id="wrapper"> 
    <div id="searchbar"> 
     <h1>PHP Search</h1> 
     <form name='searchform' id='searchform' action='<?php echo $_SERVER['PHP_SELF']; ?>' method='get'> 
      <input type='text' name='search' id='search' value='<?php echo $_GET['search']; ?>' /> 
      <input type='submit' value='Search' /> 
     </form> 
     <br /> 
     <br /> 
    </div><!-- close searchbar --> 
<?php 
include "commonwords.php"; 
$index = array(); 

$words = array(); 

// All files with a .txt extension 
// Alternate way would be "/path/to/dir/*" 
foreach (glob("./files/*.txt") as $filename) { 

    // Includes the file based on the include_path 
    $content = file_get_contents($filename, true); 

    $pat[0] = "/^\s+/"; 
    $pat[1] = "/\s{2,}/"; 
    $pat[2] = "/\s+\$/"; 
    $rep[0] = ""; 
    $rep[1] = " "; 
    $rep[2] = ""; 

    $new_content = preg_replace("/[^A-Za-z0-9\s\s+]/", "", $content); 
    $new_content = preg_replace($pat, $rep, $new_content); 
    $new_content = strtolower($new_content); 

    preg_match_all('/\S+/',$new_content,$matches,PREG_SET_ORDER); 

    foreach ($matches as $match) { 
     if (!isset($words[$filename][$match[0]])) 
      $words[$filename][$match[0]]=0; 
     $words[$filename][$match[0]]++; 
    } 
    foreach ($commonWords as $value) 
     if (isset($words[$filename][$value])) 
      unset($words[$filename][$value]); 

    $results = 0; 

    $totalCount = count($words[$filename]); 


     // And another item to the list 
    $index[] = array(
     'filename' => $filename, 
     'word' => $words[$filename], 
     'all_words_count' => $totalCount 
    ); 

} 

echo '<pre>'; 
print_r($index); 
echo '</pre>'; 
if(isset($_GET['search'])) 
{ 
    $endtime = microtime(); 
    $endarray = explode(" ", $endtime); 
    $endtime = $endarray[1] + $endarray[0]; 
    $totaltime = $endtime - $starttime; 
    $totaltime = round($totaltime,5); 
    echo "<div id='timetaken'><p>This page loaded in $totaltime seconds.</p></div>"; 
} 
?> 
</div><!-- close wrapper --> 
</body> 
</html> 
+0

Vous êtes si reconnaissant que vous n'avez jamais une seule fois mis la surexposé ou accepté une réponse? – webbiedave

+0

bien mon représentant n'est pas encore comme im nouveau, et j'ai eu 2 réponses très fortes que j'ai mis ensemble dans un autre fil (aujourd'hui) et n'a pas pu choisir entre les 2, j'en ai sélectionné un cependant maintenant ... –

Répondre

0
foreach ($index as $result) 
    if (array_key_exists($searchWord,$result['word'])) 
    echo "Found ".$searchWord." in ".$result['filename']." ".$result['word'][$searchWord]." times\r\n"; 

En aparté, je recommande fortement que la recherche des fichiers si le terme de recherche a été rempli plutôt que de chercher à chaque rafraîchissement de la page. - N'oubliez pas de déclarer les variables avant de les utiliser (par exemple, vos variables $ pat et $ rep doivent être $ pat = Array() avant de les utiliser). - Vous faites la bonne chose en haut et vérifiez l'existence d'un $ searchWord mais continuez à référencer le $ _GET ['search']; Je vous conseille de continuer à utiliser $ searchWord et de vérifier par rapport à is_null ($ searchWord) sur toute la page au lieu d'utiliser $ _GET. Il est recommandé de ne pas afficher ces variables sur la page sans vérification d'intégrité. - De plus, il peut être plus utile de vérifier si $ searchWord (ou les mots) se trouvent dans $ commonWords, puis de traiter le fichier. Pourrait prendre un certain temps hors de la recherche s'il y a beaucoup de fichiers ou de gros fichiers avec beaucoup de mots. Je ne comprends pas non plus pourquoi vous stockez tous les mots lorsque vous recherchez uniquement des mots-clés, mais si cela devient trop important, vous atteindrez bientôt une limite de mémoire.

+0

merci beaucoup! Comment pourrais-je les commander dans l'ordre le plus élevé au plus bas? C'est pour un projet uni où nous devions créer un index des mots ... suis-je en train de l'écrire alors ...? –

+0

utilisez la méthode usort de php si vous voulez organiser les éléments $ index. Si vous cherchez simplement à trier le tableau $ index [N] ['word'], utilisez asort sur ce tableau. Si vous voulez un meilleur moyen de trouver des mots, et que vous semblez familier avec regex, essayez ceci: $ words = null; if (preg_match_all ('/ \ b [a-zA-Z \ - \ x27] + \ b /', $ content, $ mots)) $ uniqueWords = array_unique ($ mots [0]); Extrait les mots sans avoir besoin de retirer le document. Peut également modifier le [...] pour inclure d'autres "Composants de mots typiques". Peut également avoir à faire quelques manipulations pour les faire en minuscules, en majuscules, etc. comme bon vous semble. –

Questions connexes