0

不知道该怎么称呼这个..无论如何:

我有一个文本文件,包括:

something;something2;something3;something4\n

我使用常规的 html 表单进行用户输入。用户输入 = $搜索。我将其发送到我的搜索功能:

function search($search) {
$lin = file('text.txt');
$lines = array_map('strtolower', $lin);
$found = false;
foreach($lines as $line) {
if(strpos($line, $search) !== false) {
$found = true;
$line = explode(";",$line);
$line[1] = ucwords($line[1]);
$line[2] = ucwords($line[2]);
$line[3] = strtoupper($line[3]);
echo "$hit[0] $hit[1] etc";
}
}
if(!$found) {
echo "No matches";
}
}

如果用户只输入一个单词,这很好用。假设文件的内容是: foo;bar;chuck;hank;

我希望用户能够搜索“foo chuck”并仍然得到结果。即使只有一个单词匹配,也应该回显该行(例如“foo carl”仍然输出整行)。

但话又说回来,如果有一个“foo;bar”和一个“foo;carl”,我不希望 foo bar 显示用户是否搜索“foo carl”..

有小费吗?

4

3 回答 3

0

使用explode将您的字符串放入一个数组中,然后遍历该数组并检查是否命中 .... 或者更好的是,使用in_array

$string='something;something2;something3;something4';
$array=explode(';',$string);
if(in_array('test',$array) || in_array('othertest',$array) || in_array('thirdval',$array)){
    ;//there's a match
}
于 2012-10-16T19:05:35.967 回答
0

您可以获取用户输入,将其拆分为单词,以与规范化文件内容相同的方式对其进行规范化,然后将它们放入数组$input中。

然后,对于文件内容中的每一行,都遵循完全相同的过程,再次以数组结尾$line

根据您的描述,当里面$input的所有单词也出现在里面时,就会发生搜索命中$line,这可以表示为:

$hit = count(array_intersect($input, $line)) == count($input);

不要忘记“修剪”$input$line使用array_unique来涵盖搜索词出现多次的情况。

示例代码:

function search($search) {
  // break input into words and normalize
  // explode() is maybe not going to cut it in production, but it's OK here
  $search = array_unique(explode(' ', strtolower($search)));
  $terms = count($search);

  $lines = file('text.txt');
  $found = false;
  foreach($lines as $line) {
    // same treatment as for input
    $line = array_unique(explode(' ', strtolower($line)));

    if(count(array_intersect($search, $line)) == $terms) {
      $found = true;
      $line = explode(";",$line);
      $line[1] = ucwords($line[1]);
      $line[2] = ucwords($line[2]);
      $line[3] = strtoupper($line[3]);
      echo "$hit[0] $hit[1] etc";
    }
  }
}
于 2012-10-16T19:10:34.067 回答
0

如果您正在处理大文件,则使用file可能不是最好的方法,因为将整个文件读入数组并将其放入内存。您的文件也看起来像 CSV,因此您可以使用fgetcsv您需要更改的所有内容是分隔符

尝试

$file = "large_file.txt";
$search = "something2";
var_dump(search($file, $search));

其他用途

search($file, $search,true); // Multiple Result
search($file, $search,true,","); // File has , has delimiter Instead of ; 

功能

function search($file, $search, $multiple = false, $delimiter = ";") {
    $handle = fopen($file, "r");
    $list = array();
    while ( ($data = fgetcsv($handle, 1024, $delimiter)) !== FALSE ) {
        if (in_array($search, $data)) {
            if ($multiple)
                $list[] = $data;
            else
                return $data;
        }
    }

    fclose($handle);
    return $list;
}
于 2012-10-16T19:18:17.680 回答