2017-09-15 9 views
0

このコードは検索機能に属します。ユーザーは$ search_stringを入力することができ、下のコードはhtmlを文字列の周りに置いて強調表示します。検索は複数単語の検索を含むように拡張されました( 'ifs ands'を検索すると、両方の単語の検索結果のみが表示されます)。複数ワードの検索と配列の配列の置換

それは配列の配列を検索し、ネストされた配列には、概要、プロシージャ、および検証という検索フィールドが含まれます。その後、配列内の値が検索され、検索した単語が強調表示されます。

foreach ($results as $s_result => $row) { 
    $results[$s_result]['overview'] = str_ireplace($search_string, "<span style=\"background-color: #ff0;\">$search_string</span>", htmlspecialchars($row['overview'])); 
    $results[$s_result]['execution'] = str_ireplace($search_string, "<span style=\"background-color: #ff0;\">$search_string</span>", htmlspecialchars($row['execution'])); 
    $results[$s_result]['verification'] = str_ireplace($search_string, "<span style=\"background-color: #ff0;\">$search_string</span>", htmlspecialchars($row['verification'])); 
} 

は、配列の配列を介して、検索キーワードの複数回反復することなく、どのように私は複数の単語を強調表示することができます/ユーザーが1つのパスに入り、キーワード?方法はないかもしれないが、私は簡単にその結論に来る。

foreach ($results as &$row) { 
    $row = str_ireplace(
     $search_string, 
     "<span class=\"highlight\">$search_string</span>", 
     array_map("htmlspecialchars", $row) 
    ); 
} 

注我々は、参照によって$rowを変更しているので、あなたが$resultsを反復する場合には、変更内容を表示します:

+0

あなたは、その配列を共有することはできますか? –

+0

質問を少し説明してください。 –

+0

質問を編集して、より明確になるようにしました。申し訳ありません。 @ SahilGulatiあなたはあなたがまだアレイを必要とする場合は、ポストを読んで、私に知らせることができますか? – baksyl

答えて

1

str_replaceので、これは動作するはずの対象として配列を取ることができます。もちろん

あなたは部分文字列と、そのようなを考慮していないので、正規表現は、このために、より適しかもしれません:あなたは本当にforeachループを取り除きたい場合は

foreach ($results as &$row) { 
    $row = preg_replace(
     "/\\b($search_string)\\b/i", 
     "<span class=\"highlight\">$1</span>", 
     array_map("htmlspecialchars", $row) 
    ); 
} 

最後に、あなたが使用することができますarray_walkはインライン関数を使用していますが、実際にどれほど速いかはわかりませんが、Cコードに戻るときにはforeachループと同じ呼び出しを使用する可能性は非常に高いです。サンプル入力でテスト

array_walk($results, function(&$v, $k) use($search_string) { 
    $v = preg_replace(
     "/\\b($search_string)\\b/i", 
     "<span class=\"highlight\">$1</span>", 
     array_map("htmlspecialchars", $v) 
    ); 
}); 

$search_string = "foobar"; 
$results = [ 
    ["overview"=>"some fobar text", "execution"=>"some foobr text", "verification"=>"some foobar text"], 
    ["overview"=>"some fbar text", "execution"=>"some fobr text", "verification"=>"some foobarbaz text"], 
];