2014-02-11 134 views
0

我的搜索结果现在正在打印每一个条目,每当有与我的txt文件匹配的字段;它不会打印出过滤结果。我如何更改if语句以便实现缩小功能?谢谢!PHP缩小搜索范围

这里是我的handle_search.php:

$delimiter = ' | '; 
if(isset($_POST['submit'])){ 

$seasonsr = $_POST["seasonsr"]; 
$numbersr = $_POST["numbersr"]; 
$titlesr = $_POST["titlesr"]; 
$directorsr = $_POST["directorsr"]; 
$datesr = $_POST["datesr"]; 

$file = fopen("park.txt", "r");  

    if (!$file) { 
    die("There was a problem opening the park.txt file"); 
    } 

$search = file("park.txt"); 
$isfound = false; 

foreach($search as $find){ 

    $match = false; 
    $explode = explode($delimiter, $find); 
    if ($seasonsr == $explode [0] && $_POST['seasonsr'] != "") { 
     print $explode [0]. " " . $explode[1]. " " . $explode[2]. " " . $explode[3]. 
" " .  $explode[4]; 
     print ("<br/>"); 
     $isfound = true; 
    $match = true; 
    } 

    if ($numbersr == $explode [1] && $_POST['numbersr'] != "" && !$match) { 
     print $explode [0]. " " . $explode[1]. " " . $explode[2]. " " . $explode[3]. 
" " . $explode[4]; 
     print ("<br/>"); 
     $isfound = true; 
     $match = true; 
    } 

    if ($titlesr == $explode [2] && $_POST['titlesr'] != "" && !$match) { 
     print $explode [0]. " " . $explode[1]. " " . $explode[2]. " " . $explode[3]. 
" " . $explode[4]; 
     print ("<br/>"); 
     $isfound = true; 
     $match = true; 
    } 


    if ($directorsr == $explode [3] && $_POST['directorsr'] != "" && !$match) { 
     print $explode [0]. " " . $explode[1]. " " . $explode[2]. " " . $explode[3]. 
" " . $explode[4]; 
     print ("<br/>"); 
     $isfound = true; 
     $match = true; 
    } 

$itemdate= $explode[4]; 
    //print("<p>search: $datesr item: $itemdate match: </p>"); 
    if (trim($datesr) == trim($explode [4]) && $_POST['datesr'] != "" && !$match) { 
     print $explode [0]. " " . $explode[1]. " " . $explode[2]. " " . $explode[3]. 
" " . $explode[4]; 
     print ("<br/>"); 
     $isfound = true; 
     $match = true; 
    } 

} 
if(!$isfound){ 
    echo ("Sorry! No search found."); 
} 
} 
fclose($file); 
} 
+0

让你有一个管道分隔的文件?我会强烈考虑使用'fgetcsv()'功能来更轻松地将每行读入数组。这也使得它不必像你目前正在做的那样将整个文件读入内存。一次只能使用一行。 –

回答

1

几个秘诀:

  • 你应该fgetcsv工作,因为你有一个分隔的文件。
  • 我也会考虑将匹配值放入数组中以方便比较。不需要做所有那些疯狂的条件。
  • 将您的输出生成放入函数或类似的可重用代码段中,而不是一遍又一遍地写同一行。
  • 您可能应该进行某种POST数据验证,以确保您以预期的格式获取数据(这在下面的示例中未显示)。

全部放在一起可能是这样的:

$delimiter = ' | '; 
// array of POST field names you are interested in 
$match_fields = array(
    'seasonr', 
    'numbersr', 
    'titlesr', 
    'directorsr', 
    'datesr' 
); 
// array to store POSTed values 
$match_values = array(); 

if(isset($_POST['submit'])){ 
    // load POSTed values into match array 
    foreach($match_fields as $i => $field) { 
     $match_values[$i] = null; 
     if(!empty($_POST[$field])) { 
      $match_values[$i] = $_POST[$field]; 
     } 
    } 

    // open file to read 
    $file = fopen("park.txt", "r");  

    if (!$file) { 
     die("There was a problem opening the park.txt file"); 
    } 

    $isfound = false; 
    // $match = false; -- not used as this seems same as $isfound 

    // go through file one line at a time 
    while($line = fgetcsv($file, 0, $delimiter)) { 
     for($i = 0; $i < count($line); $i++) { 
      if($line[i] === $match_values[$i]) { 
       $isfound = true; 
       print_line($line); 
       break; 
      } 
     } 
    } 

    fclose($file); 

    if (false === $isfound) { 
     echo 'No results found'; 
    } 
} else { 
    // no POST was made do something else 
} 

function print_line($line) { 
    $string = ''; 
    foreach($line as $item) { 
     $string .= $item . ' '; 
    } 
    rtrim($string); 
    $string .= '<br/>'; 
    echo $string; 
}