优化PHP in_array()函数,效率提高50倍
/原始程序 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.scutephp.com则是scutephp】全部由$pin_arr中n个元素组成,则是n拼域名。
看看优化后的程序代码:
/** * 优化后的判断n拼域名函数 * */ $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()函数:
这里我了解到PHP Array的KEY是进行HASH组织的,查询很快。而VALUE是由KEY组织存放,本身没有索引,每次查找都是遍历。
于是,我将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()。于是效率又提高了几倍。
最后当然是把执行函数strlen($str)提到循环外,这不用多说了吧!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

目前,PHP已成為網路開發中最加盛行的程式語言之一,而PHP程式的效能最佳化也成為了最迫切的問題之一。在處理大規模的並發請求時,一秒鐘的延遲都可能對使用者體驗產生巨大的影響。如今,APCu(AlternativePHPCache)快取技術已成為最佳化PHP應用效能的重要的方法之一。本文將介紹如何使用APCu快取技術來最佳化PHP應用程式的效能。一、APC

隨著互聯網的發展,PHP應用程式在網路應用領域中變得越來越常見。但是,PHP應用程式的高並發存取會導致伺服器的CPU使用率高,進而影響應用程式的效能。為了優化PHP應用程式的效能,Memcached快取技術成為了一個很好的選擇。本文將介紹如何使用Memcached快取技術最佳化PHP應用程式CPU的使用率。 Memcached快取技術簡介Memcached是一

如何透過PHP優化SuiteCRM的用戶端效能概述:SuiteCRM是一個功能強大的開源客戶關係管理(CRM)系統,但在處理大量資料和並髮使用者時,可能會出現效能問題。本文將介紹一些透過PHP程式設計技巧來優化SuiteCRM客戶端效能的方法,並附上對應的程式碼範例。使用適當的資料查詢和索引資料庫查詢是CRM系統的核心操作之一。為了提高查詢效能,需要使用適當的資料查

如何最佳化PHP的資料庫連線與查詢效能?資料庫是Web開發中不可或缺的一部分,而PHP作為一種廣泛使用的伺服器端腳本語言,其與資料庫的連接和查詢效能對於整個系統的效能至關重要。本文將介紹一些優化PHP資料庫連接和查詢效能的技巧和建議。使用持久化連線:在PHP中,每次執行資料庫查詢時都會建立一次資料庫連線。而持久化連接可以在多次查詢中重複使用同一個資料庫連接,從而減

針對不同PHP版本最佳化函數效能的方法包括:使用分析工具識別函數瓶頸;啟用opcode快取或使用外部快取系統;新增類型註解提高效能;根據PHP版本選擇合適的字串連線和排序演算法。

如何透過PHP優化SuiteCRM的使用者介面SuiteCRM是一個受歡迎的開源CRM(客戶關係管理)軟體,它提供了強大的功能和靈活的可自訂性。然而,在使用SuiteCRM時,有時會發現使用者介面(UI)的效能不佳或不夠符合特定的需求。這時,我們可以透過使用PHP程式語言對SuiteCRM的使用者介面進行最佳化,以提高效能並滿足特定需求。本文將介紹一些優化SuiteC

如何利用PHP優化SuiteCRM的專案管理功能SuiteCRM是一款功能強大的開源客戶關係管理(CRM)系統,它提供了廣泛的功能和可自訂性。在專案管理方面,SuiteCRM提供了一些基本功能,如任務分配、進度追蹤和檔案共用等。然而,有時我們需要根據特定的業務需求對專案管理功能進行最佳化。在本文中,我們將介紹如何利用PHP程式語言來擴充和最佳化SuiteCRM的

如何利用PHP優化織夢建站效果在當今網路崛起浪潮中,搭建一個高效、優質的網站愈發重要。織夢(DedeCMS)是一個功能強大的網站建立系統,但有時候它的預設功能可能無法完全滿足我們的需求。在這篇文章中,我們將探討如何利用PHP優化織夢建站效果,並提供一些具體的程式碼範例。 1.優化網站速度網站速度是使用者體驗和SEO排名的重要因素之一,透過優化PHP程式碼可以提高網站
