1

我担心速度,因为 do 循环可能必须运行 15-20 次。在每个循环中,我搜索和替换几次,每次从 mysql 表中选择一次。我只是希望它尽可能快。

$text = file_get_contents('texts/phir-mohabbat.txt');
preg_match_all('/\S+@/', $text, $words);
preg_match_all('/@\S+/', $text, $lexs);

$count = count($words[0]);
$i = 0;
do {
  $bad = array('@', ',', '।', '?');
  $word = str_replace('@', '', $words[0][$i]);
  $lex = str_replace($bad, '', $lexs[0][$i]);
  if($lex == '#') {$lex = $word;}

  $get_def = mysqli_query($con,"SELECT * FROM hindi_dictionary WHERE lex = '$lex'");
  while($row = mysqli_fetch_array($get_def)) {
    $def = $row['def'];
    }
  $find = array($word.'@'.$lex, $word.'@#');
  $replace = '<span class = "word-info" onmouseover="show_info(\''.$lex.' - '.$def.'\',\''.$word.'\');">'.$word.'</span>';

  $text = str_replace($find, $replace, $text);
  $i++;
  } while ($i < $count);

echo nl2br($text);
4

1 回答 1

1

我看到@Blorgbeard 比我快:) 您可以更改代码以仅调用数据库一次 - 这应该会显着提高速度,例如:

...
$res = array();
for($i=0; $i<$count; $i++){     
    $word = str_replace('@', '', $words[0][$i]);
    $lex = str_replace($bad, '', $lexs[0][$i]);
    if($lex == '#') {$lex = $word;}
    $res[] = $lex;
}
$query = "SELECT * FROM hindi_dictionary WHERE lex in ('";
$query .= implode($res,"','") . "')";

echo $query; // something like: "SELECT * FROM hindi_dictionary WHERE lex in ('a','b','c','f')"
...

并继续按照您最初的预期处理返回的结果集 - 只是现在您将收到所有结果并对其进行迭代。

评论:

不建议使用mysql_*已弃用且易受 sql-injection 影响的函数(参见红色框)。最好使用PDOMySQLi

于 2013-08-14T03:59:44.687 回答