此代码属于搜索功能。用户可以输入$ 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']));
}
没有必须为每个搜索关键字多次遍历数组数组,如何突出显示用户在一次传递中输入的多个单词/关键字?可能没有办法,但我不能轻易得出这个结论。
答案 0 :(得分:1)
str_replace
可以将数组作为主题,因此这应该有效:
foreach ($results as &$row) {
$row = str_ireplace(
$search_string,
"<span class=\"highlight\">$search_string</span>",
array_map("htmlspecialchars", $row)
);
}
请注意,我们正在通过引用更改$row
,因此当您遍历$results
时,它会显示更改。
当然你不考虑子串等等,所以正则表达式可能更适合这个:
foreach ($results as &$row) {
$row = preg_replace(
"/\\b($search_string)\\b/i",
"<span class=\"highlight\">$1</span>",
array_map("htmlspecialchars", $row)
);
}
最后,如果你真的想摆脱foreach
循环,你可以使用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"],
];