0

これを何と呼ぶべきか正確にはわかりませんでした..とにかく:

次のもので構成されるテキストファイルがあります。

something;something2;something3;something4\n

ユーザー入力には通常の html フォームを使用します。ユーザー入力 = $search. これを検索機能に送信します。

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";
}
}

これは、ユーザーが単語を 1 つだけ入力した場合にうまく機能します。ファイルの内容が foo;bar;chuck;hank; であるとしましょう。

ユーザーが「foouck」を検索しても結果が得られるようにしたいと思います。一致する単語が 1 つだけの場合でも、その行をエコーする必要があります (例: "foo carl" は行全体を出力します)。

ただし、「foo;bar」と「foo;carl」がある場合、ユーザーが「foo carl」を検索した場合に foo bar を表示したくありません。

任意のヒント?

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 に答える