这两天写irc机器人,有个地方需要一个查询字符串数组中元素是否在另一个字符串的功能。当时第一个想到的是不是有什么函数。毕竟PHP的函数千奇百怪、无奇不有嘛。不过才疏学浅的我愣是没有找到。所以只能自己操刀实现了,思路有两个:

  • 遍历数组,然后将数组中的每个元素,用strstr()函数查询该元素是否在指定字符串中;

  • 将数组转换成以|分割的字符串,两边加上括号,形成一个正则或表达式。以这个表达式通过preg_match函数进行匹配。

在实现之前,分析了一下,第一种方式复杂,要套用循环。尤其本引用中要对多个字符串数组都进行这样的查询。感觉很消耗时间。而第二种方式简单,代码也简单,而且还少嵌套一套循环。

不过毛主席常常教育我们,没有调查就没有发言权。所以我就老老实实的用代码测试一下两种思路的效率。

测试代码如下:

上面的代码非常贴近我的使用环境。被查询的字符串就是$message,查询的字符串数组是$keywords,它的每一个元素都是一个字符串数组。要实现的目标就是查询$keywords的每一个元素数组中的各个元素是否在$message中出现。

结果根据每次运行情况不一,这里仅截取几组结果以供对比:

2.8999999999946E-5<======>0.00012200000000007

2.9999999999974E-5<======>0.00012100000000004

3.4E-5<======>0.000131

看到了吧,别说比大小了,连数量级都不是一个档次的。原本以为通过嵌套foreach循环会导致效率大大降低,结果多一层循环却不如多一个正则表达式。这件事情再次残酷的告诉我,正则表达式,好玩但少用。