php in_array()优化
开年首篇文章,后天上班了,正在调整状态。年前室友问我一段程序效率问题,刚好来研究下!该函数是关于判断域名字符串是否是单拼域名、双拼域名、三拼域名。。。多拼域名问题:
//原始程序
function pinyin($str) { //判断是否是 单拼 双拼 三拼 四拼
$pin_arr = array("a", "ai", "an", "ang", "ao", "ba", "bai", "ban", "bang", "bao", "bei", "ben", "beng", "bi", "bian", "biao", "bie", "bin", "bing", "bo", "bu", "ca", "cai", "can", "cang", "cao", "ce", "ceng", "cha", "chai", "chan", "chang", "cao", "che", "chen", "cheng", "chi", "chong", "chou", "chu", "chuai", "chuan", "chuang", "chui", "chun", "chuo", "ci", "cong", "cou", "cu", "chuan", "cui", "cun", "cuo", "da", "dai", "dan", "dang", "dao", "de", "deng", "di", "dian", "diao", "die", "ding", "dui", "dong", "dou", "du", "duan", "dui", "dun", "duo", "e", "en", "er", "fa", "fan", "fang", "fei", "fen", "feng", "fo", "fou", "fu", "ga", "gai", "gan", "gang", "gao", "ge", "gei", "gen", "geng", "gong", "gou", "gu", "gua", "guai", "guan", "guang", "gui", "gun", "guo", "ha", "hai", "han", "hang", "hao", "he", "hei", "hen", "heng", "hong", "hou", "hu", "hua", "huai", "huan", "huang", "hui", "hun", "huo", "ji", "jia", "jian", "jiang", "jiao", "jie", "jin", "jing", "jiong", "jiu", "ju", "juan", "jue", "jun", "ka", "kai", "kan", "kang", "kao", "ke", "kei", "ken", "keng", "kong", "kou", "ku", "kua", "kuai", "kuan", "kuang", "kui", "kun", "kuo", "la", "lai", "lan", "lang", "lao", "le", "lei", "leng", "li", "lia", "lian", "liang", "liao", "lie", "lin", "ling", "liu", "long", "lou", "lu", "lv", "luan", "lue", "lun", "luo", "ma", "mai", "man", "mang", "mao", "me", "mei", "men", "meng", "mi", "mian", "miao", "mie", "min", "ming", "miu", "mo", "mou", "mu", "na", "nai", "nan", "nang", "nao", "ne", "nei", "nen", "neng", "ni", "nian", "niang", "niao", "nie", "nin", "ning", "niu", "nong", "nu", "nv", "nuan", "nue", "nuo", "ou", "pa", "pai", "pan", "pang", "pao", "pei", "pen", "peng", "pi", "pian", "piao", "pie", "pin", "ping", "po", "pou", "pu", "qi", "qia", "qian", "qiang", "qiao", "qie", "qin", "qing", "qiong", "qiu", "qu", "quan", "que", "qun", "ran", "rang", "rao", "re", "ren", "reng", "ri", "rong", "rou", "ru", "ruan", "rui", "run", "ruo", "sa", "sai", "san", "sang", "sao", "se", "sen", "seng", "sha", "shai", "shan", "shang", "shao", "she", "shen", "sheng", "shi", "shou", "shu", "shua", "shuai", "shuan", "shuang", "shui", "shun", "shuo", "si", "song", "sou", "su", "suan", "sui", "sun", "suo", "ta", "tai", "tan", "tang", "tao", "te", "teng", "ti", "tian", "tiao", "tie", "ting", "tong", "tou", "tu", "tuan", "tui", "tun", "tuo", "wa", "wai", "wan", "wang", "wei", "wen", "weng", "wo", "wu", "xi", "xia", "xian", "xiang", "xiao", "xie", "xin", "xing", "xiong", "xiu", "xu", "xuan", "xue", "xun", "ya", "yan", "yong", "yao", "ye", "yi", "yin", "ying", "yo", "yong", "you", "yu", "yuan", "yue", "yun", "za", "zai", "zan", "zang", "zao", "ze", "zei", "zen", "zeng", "zha", "zhai", "zhan", "zhong", "zhao", "zhe", "zhen", "zheng", "zhi", "zhong", "zhou", "zhu", "zhua", "zhuai", "zhuan", "zhuang", "zhui", "zhun", "zhuo", "zi", "zong", "zou", "zu", "zuan", "zui", "zun", "zuo");
if (in_array($str, $pin_arr)) {
return 1;
}
for ($i = 1; $i < strlen($str); $i++) {
if ($i < 7) {
if (pinyin(substr($str, 0, $i)) && $n = pinyin(substr($str, $i))) {
return $n + 1;
}
} else {
return 0;
}
}
return 0;
}
上面$pin_arr是个大数组,大概400个元素,从上可以看出单拼域名、双拼域名、三拼域名概念:如果一个域名【这里$str是指域名的中间部分,如www.phpddt.com则是phpddt】全部由$pin_arr中n个元素组成,则是n拼域名。
看看优化后的程序代码:
/**
* 优化后的判断n拼域名函数
*
* @copyright http://www.phpddt.com
*/
$pin_arr =array('a'=>'','ai'=>'','an'=>'','ang'=>'','ao'=>'','ba'=>'','bai'=>'','ban'=>'','bang'=>'','bao'=>'','bei'=>'','ben'=>'','beng'=>'','bi'=>'','bian'=>'','biao'=>'','bie'=>'','bin'=>'','bing'=>'','bo'=>'','bu'=>'','ca'=>'','cai'=>'','can'=>'','cang'=>'','cao'=>'','ce'=>'','ceng'=>'','cha'=>'','chai'=>'','chan'=>'','chang'=>'','cao'=>'','che'=>'','chen'=>'','cheng'=>'','chi'=>'','chong'=>'','chou'=>'','chu'=>'','chuai'=>'','chuan'=>'','chuang'=>'','chui'=>'','chun'=>'','chuo'=>'','ci'=>'','cong'=>'','cou'=>'','cu'=>'','chuan'=>'','cui'=>'','cun'=>'','cuo'=>'','da'=>'','dai'=>'','dan'=>'','dang'=>'','dao'=>'','de'=>'','deng'=>'','di'=>'','dian'=>'','diao'=>'','die'=>'','ding'=>'','dui'=>'','dong'=>'','dou'=>'','du'=>'','duan'=>'','dui'=>'','dun'=>'','duo'=>'','e'=>'','en'=>'','er'=>'','fa'=>'','fan'=>'','fang'=>'','fei'=>'','fen'=>'','feng'=>'','fo'=>'','fou'=>'','fu'=>'','ga'=>'','gai'=>'','gan'=>'','gang'=>'','gao'=>'','ge'=>'','gei'=>'','gen'=>'','geng'=>'','gong'=>'','gou'=>'','gu'=>'','gua'=>'','guai'=>'','guan'=>'','guang'=>'','gui'=>'','gun'=>'','guo'=>'','ha'=>'','hai'=>'','han'=>'','hang'=>'','hao'=>'','he'=>'','hei'=>'','hen'=>'','heng'=>'','hong'=>'','hou'=>'','hu'=>'','hua'=>'','huai'=>'','huan'=>'','huang'=>'','hui'=>'','hun'=>'','huo'=>'','ji'=>'','jia'=>'','jian'=>'','jiang'=>'','jiao'=>'','jie'=>'','jin'=>'','jing'=>'','jiong'=>'','jiu'=>'','ju'=>'','juan'=>'','jue'=>'','jun'=>'','ka'=>'','kai'=>'','kan'=>'','kang'=>'','kao'=>'','ke'=>'','kei'=>'','ken'=>'','keng'=>'','kong'=>'','kou'=>'','ku'=>'','kua'=>'','kuai'=>'','kuan'=>'','kuang'=>'','kui'=>'','kun'=>'','kuo'=>'','la'=>'','lai'=>'','lan'=>'','lang'=>'','lao'=>'','le'=>'','lei'=>'','leng'=>'','li'=>'','lia'=>'','lian'=>'','liang'=>'','liao'=>'','lie'=>'','lin'=>'','ling'=>'','liu'=>'','long'=>'','lou'=>'','lu'=>'','lv'=>'','luan'=>'','lue'=>'','lun'=>'','luo'=>'','ma'=>'','mai'=>'','man'=>'','mang'=>'','mao'=>'','me'=>'','mei'=>'','men'=>'','meng'=>'','mi'=>'','mian'=>'','miao'=>'','mie'=>'','min'=>'','ming'=>'','miu'=>'','mo'=>'','mou'=>'','mu'=>'','na'=>'','nai'=>'','nan'=>'','nang'=>'','nao'=>'','ne'=>'','nei'=>'','nen'=>'','neng'=>'','ni'=>'','nian'=>'','niang'=>'','niao'=>'','nie'=>'','nin'=>'','ning'=>'','niu'=>'','nong'=>'','nu'=>'','nv'=>'','nuan'=>'','nue'=>'','nuo'=>'','ou'=>'','pa'=>'','pai'=>'','pan'=>'','pang'=>'','pao'=>'','pei'=>'','pen'=>'','peng'=>'','pi'=>'','pian'=>'','piao'=>'','pie'=>'','pin'=>'','ping'=>'','po'=>'','pou'=>'','pu'=>'','qi'=>'','qia'=>'','qian'=>'','qiang'=>'','qiao'=>'','qie'=>'','qin'=>'','qing'=>'','qiong'=>'','qiu'=>'','qu'=>'','quan'=>'','que'=>'','qun'=>'','ran'=>'','rang'=>'','rao'=>'','re'=>'','ren'=>'','reng'=>'','ri'=>'','rong'=>'','rou'=>'','ru'=>'','ruan'=>'','rui'=>'','run'=>'','ruo'=>'','sa'=>'','sai'=>'','san'=>'','sang'=>'','sao'=>'','se'=>'','sen'=>'','seng'=>'','sha'=>'','shai'=>'','shan'=>'','shang'=>'','shao'=>'','she'=>'','shen'=>'','sheng'=>'','shi'=>'','shou'=>'','shu'=>'','shua'=>'','shuai'=>'','shuan'=>'','shuang'=>'','shui'=>'','shun'=>'','shuo'=>'','si'=>'','song'=>'','sou'=>'','su'=>'','suan'=>'','sui'=>'','sun'=>'','suo'=>'','ta'=>'','tai'=>'','tan'=>'','tang'=>'','tao'=>'','te'=>'','teng'=>'','ti'=>'','tian'=>'','tiao'=>'','tie'=>'','ting'=>'','tong'=>'','tou'=>'','tu'=>'','tuan'=>'','tui'=>'','tun'=>'','tuo'=>'','wa'=>'','wai'=>'','wan'=>'','wang'=>'','wei'=>'','wen'=>'','weng'=>'','wo'=>'','wu'=>'','xi'=>'','xia'=>'','xian'=>'','xiang'=>'','xiao'=>'','xie'=>'','xin'=>'','xing'=>'','xiong'=>'','xiu'=>'','xu'=>'','xuan'=>'','xue'=>'','xun'=>'','ya'=>'','yan'=>'','yong'=>'','yao'=>'','ye'=>'','yi'=>'','yin'=>'','ying'=>'','yo'=>'','yong'=>'','you'=>'','yu'=>'','yuan'=>'','yue'=>'','yun'=>'','za'=>'','zai'=>'','zan'=>'','zang'=>'','zao'=>'','ze'=>'','zei'=>'','zen'=>'','zeng'=>'','zha'=>'','zhai'=>'','zhan'=>'','zhong'=>'','zhao'=>'','zhe'=>'','zhen'=>'','zheng'=>'','zhi'=>'','zhong'=>'','zhou'=>'','zhu'=>'','zhua'=>'','zhuai'=>'','zhuan'=>'','zhuang'=>'','zhui'=>'','zhun'=>'','zhuo'=>'','zi'=>'','zong'=>'','zou'=>'','zu'=>'','zuan'=>'','zui'=>'','zun'=>'','zuo'=>'');
function changed_pinyin($str) { //判断是否是 单拼 双拼 三拼 四拼
global $pin_arr;
if(isset($pin_arr[$str])){
return 1;
}
$length = strlen($str);
for ($i = 1; $i < $length; $i++) {
if ($i < 7) {
if (changed_pinyin(substr($str, 0, $i)) && $n = changed_pinyin(substr($str, $i))) {
return $n + 1;
}
} else {
return 0;
}
}
return 0;
}
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
//随机生成字符串用于测试
$random_array = array();
for($i = 0; $i < 5000; $i++){
$str = array_merge(range(0,9),range('a','z'));
shuffle($str);
$random_array[] = implode('',array_slice($str,0, array_rand(range(2, 15))));
}
$time_start = microtime_float();
foreach($random_array as $row){
changed_pinyin($row); //大于30s
//pinyin($row); //小于0.5s
}
$time_end = microtime_float();
$time = $time_end - $time_start;
echo "耗时: $time seconds\n";
很显然上面这个函数主要一直在执行in_array()函数,所以第一步就是优化in_array()函数:
于是,我将in_array()那段改了下:
- $pin_arr = array_flip($pin_arr);
- if(array_key_exists($str,$pin_arr)){
- return 1;
- }
效率提高不明显,考虑到$pin_arr数组太大,于是我将其作为全局变量,提到外面,于是时间缩短了几十倍,对于判断数组元素是否存在,通过测试发现使用array_key_exists随着循环的次数增加,程序运行的时间增加量是成几何级数增加的,当一个数组元素个数超过1000时运行速度就非常慢了,isset()的效率要远高于array_key_exists()。于是效率又提高了几倍。
$search_array = array('first' => null, 'second' => 4);
// returns false
isset($search_array['first']);
// returns true
array_key_exists('first', $search_array);
?>
php in_array()优化的更多相关文章
- PHP性能优化:in_array和isset 在大数组查询中耗时相差巨大,以及巧妙使用array_flip
今天在PHP业务开发中,发现了一个问题. 两个较大数组(20万+元素),遍历其中一个$a,另一个数组$b用于查找元素. 比如 foreach($a as $val){ if(in_array($xx, ...
- PHP去重算法的优化过程
最近公司在做一个项目,需要对爬取到的数据进行去重,方法就是根据数据的id,去除掉id重复的数据. 下面是这个方法的演化过程. // 去重 $arr_id = array(); $LeTVFeedLis ...
- ECshop网店系统百万级商品量性能优化-加快首页访问速度
如果ECshop的商品数达到几万,十几万的时候,如果首页没有缓存,第一次访问的时候,你会发现其慢无比,原因就是清空了Cache后或者没有Cache的情况下,ECshop会Bulid一些Cache数据, ...
- PHP优化的总结
今天看了下PHPBB的相关规范,觉得有很多值得学习之处. 以下就几点PHP的优化做下总结: 1.in_array的用法 避免在大的数组上使用 in_array(),同时避免在循环中对包含20个以上元素 ...
- 减少HTTP请求之合并图片详解(大型网站优化技术)
原文:减少HTTP请求之合并图片详解(大型网站优化技术) 一.相关知识讲解 看过雅虎的前端优化35条建议,都知道优化前端是有多么重要.页面的加载速度直接影响到用户的体验.80%的终端用户响应时间都花在 ...
- PHP 性能优化一
PHP性能优化?对于这个问题,我们首先要知道影响PHP的性能的原因是什么? 1.什么情况下会出现PHP性能问题? 1)PHP语法使用 不当(包括某些业务可以使用PHP本身自带的函数来处理) 2)使用P ...
- web性能优化实践
一.SQL查询优化 1.循环中有多次查询sql,改为在循环外一次查询后再处理 2.循环多次插入,改为组装好数据后批量插入 3.梳理业务逻辑能一次查完的,绝不分多次查 4.索引用起来 5.分页查询 二. ...
- PHP服务端优化全面总结
一.优化PHP原则 1.1PHP代码的优化 (1)升级最新的PHP版本 鸟哥PPT里的对比数据,就是WordPress在PHP5.6执行100次会产生70亿次的CPU指令执行数目,而在PHP7中只需要 ...
- 关于DOM的操作以及性能优化问题-重绘重排
写在前面: 大家都知道DOM的操作很昂贵. 然后贵在什么地方呢? 一.访问DOM元素 二.修改DOM引起的重绘重排 一.访问DOM 像书上的比喻:把DOM和JavaScript(这里指ECMScri ...
随机推荐
- Gitlab+Jenkins学习之路(十二)之Maven的私有仓库Nexus
1.什么是Nexus? 在前面进行maven项目的构建中,可以看到在构建的过程中需要安装maven的依赖插件,如图: 而在maven的默认配置中是在官网的中央仓库和第三方的maven仓库进行下载,速度 ...
- 【CJOJ2433】陌上花开 CDQ分治
[CJOJ2433]陌上花开 CDQ呲嘚秋分治 WA果然呲嘚秋分治跑得比树套树还快!!!(md理论复杂度不是一样的吗) 但树套树不知道比呲嘚秋高到哪里去辣装X用 Orz hzwer 第一维sort,第 ...
- Python 学习 第五篇:语句和语法
Python程序是语句构成的,语句包含表达式,表达式嵌套在语句中,包含变量和常量,用于处理对象.Python的语法实质上是由表达式.语句和代码块构成的.语句是由表达式构成的,代码块是由多个语句构成的复 ...
- SourceTree跳过注册安装使用
%LocalAppData%\Atlassian\SourceTree\目录 创建一个accounts.json [ { "$id": "1", ...
- python图像处理(1)图像的打开与保存
使用python进行图像处理时有三种库可以使用分别是:PIL.matplotlib.pyplot.opencv(opencv未接触) 注意:matplotlib读取进来的图片是unit8,0-255范 ...
- Unity面试技巧之C#基础
1. 定义常量最好使用运行是常量就是readonly 编译常量就是 const public static readonly MyClass myClass = new MyClass(); publ ...
- jenkins的时间与服务器的时间不一致
解决办法:
- 详细介绍redis的集群功能,带你了解真正意义上的分布式
Redis 集群是一个分布式(distributed).容错(fault-tolerant)的 Redis 实现, 集群可以使用的功能是普通单机 Redis 所能使用的功能的一个子集(subset). ...
- python数据分析系列(1)
目录 python基础 python语言基础 Ipython的一些特性 Python语法基础 Python控制流 lambda表达式 Python的数据结构 元组 列表 字典 集合 列表.集合.字典推 ...
- 线程_synchronized_volatile_ReentranLock
线程:cpu同时执行多个任务 synchonized 代码块,对象,类 同步方法和非同步方法可以同时执行同步方法可以调用同步方法(重入)脏读:之同步写,不同步读死锁的demo 一个线程先对A加锁 ...