Php数组搜索优化

标签 php arrays optimization

这是任务。 我需要识别一个字符串是否包含一些城镇名称。 换句话说 - 从一些文本中识别出一个城镇。

作为输入,我有文本进行搜索和地理编码。 根据地理编码,城镇列表从数据库中加载。

现在,当前的实现是循环遍历这些城镇的列表,并尝试将其与短路评估的使用相匹配。 喜欢:

if (stripos($text, $currentTown) !== false && 
    preg_match("#\b$currentTown\b#i", $text)) {
    // add town to recognized list
}

问题是我有,例如英国的城镇列表(大约 40 000)循环将花费“相当长的时间”。

所以我的问题是如何优化识别时间。 也许数组中有一些高级搜索?

欢迎提出任何想法。

谢谢。

最佳答案

虽然我最好的选择是立即使用 'MySQL full text search'我会尝试解决你的问题。我将尝试从“最佳结果”开始。

  1. 将所有城镇数据保持小写(或至少在您搜索的位置)并在搜索前使用 $text = strtolower($text);:这样您就可以使用 strpos 区分大小写的搜索 > 不区分大小写的搜索

  2. 何必用 preg_match();因为你用 stripos 做了 99% 相同的事情。你可以跳过它。

  3. 也许添加一些小检查,例如 if strlen($text) < 4 甚至不要尝试搜索,因为它会给出可怕的结果。

  4. 按长度排序您的数据(这非常昂贵,因此执行一次并存储它)并跳过比输入短的当前城镇。

  5. 按字母顺序排列您的数据,只浏览与第一个字母(或第一个 + 第二个字母)匹配的部分

  6. 可能会缓存结果/搜索。然后你只需要搜索你的缓存,如果它能找到一些行(但是你的缓存错过伤害)

  7. 如果您有大型数据集,可能是 PHP Iterator class可以帮忙。它可以加快遍历每条记录的过程。

关于Php数组搜索优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12038154/

相关文章:

c++ - 转换/旋转字节数组中的位

javascript - WebGL 为许多相同的对象计算 GPU 上的顶点?

php - Wordpress - 将 wp_redirect url 更改为动态链接

php - 有什么方法可以使用 PHP 或 Xslt 提取单个 XML 标记的各个部分?

ios - 我可以返回两个数组吗?

c 排序大型结构数组并打印到屏幕

c++ - 在线程争用情况下等待的最快方法

c++ - 这会累积多少浮点错误?

php - Nginx 配置问题 : getting 403 Forbidden

php - preg_replace 替换动态图片 URL