- 論壇徽章:
- 0
|
最近項目使用symfony框架,這個框架對數(shù)據(jù)庫的操作在這個團隊里使用的是ORM進行操作,說實話使用ORM的開發(fā)效率和運行效率不一定高多少,到是它的實體命名和現(xiàn)有數(shù)據(jù)庫字段的命名不太一樣,ORM實體屬性命名是駝峰式的,數(shù)據(jù)庫字段是下劃線分隔,這就產(chǎn)生了字段映射的過程。當碰到需要手動寫實體必須的數(shù)組時,字段映射是一件很頭疼的事情,尤其是字段比較多的時候,寫到你想吐。到這就產(chǎn)生一個問題就是把以下劃線分隔的命名字段轉換成駝峰式命名。小弟我也很懶,在網(wǎng)上找了半天,也沒找到一個具體的PHP Demo,有的也是java寫的,還著還挺復雜。于是乎我就自己動手豐衣足食,順手寫了幾個,廢話不多說直接貼代碼:- <?php
- //微妙時間
- function microtime_float()
- {
- list($usec, $sec) = explode(" ", microtime());
- return ((float)$usec + (float)$sec);
- }
-
- //將下劃線命名轉換為駝峰式命名
- function convertUnderline1 ( $str , $ucfirst = true)
- {
- while(($pos = strpos($str , '_'))!==false)
- $str = substr($str , 0 , $pos).ucfirst(substr($str , $pos+1));
-
- return $ucfirst ? ucfirst($str) : $str;
- }
-
- //將下劃線命名轉換為駝峰式命名
- function convertUnderline2 ( $str , $ucfirst = true)
- {
- $str = explode('_' , $str);
- foreach($str as $key=>$val)
- $str[$key] = ucfirst($val);
-
- if(!$ucfirst)
- $str[0] = strtolower($str[0]);
-
- return implode('' , $str);
- }
-
- //將下劃線命名轉換為駝峰式命名
- function convertUnderline3 ( $str , $ucfirst = true)
- {
- $str = ucwords(str_replace('_', ' ', $str));
- $str = str_replace(' ','',lcfirst($str));
- return $ucfirst ? ucfirst($str) : $str;
- }
-
- //將下劃線命名轉換為駝峰式命名
- function convertUnderline4 ( $str , $ucfirst = true)
- {
- $str = preg_replace('/_([A-Za-z])/e',"strtoupper('$1')",$str);
- return $ucfirst ? ucfirst($str) : $str;
- }
-
- //將下劃線命名轉換為駝峰式命名
- function convertUnderline5 ( $str , $ucfirst = true)
- {
- $str = preg_replace_callback('/([-_]+([a-z]{1}))/i',function($matches){
- return strtoupper($matches[2]);
- },$str);
- return $ucfirst ? ucfirst($str) : $str;
- }
-
- $counts = 100000;
- //第1種方式調(diào)用10w次所需時間
- $s1 = microtime_float();
- for ($i=0;$i<$counts;$i++)
- {
- $str= 'abcd_efgh_igk_lmn';
- convertUnderline1($str);
- }
- $e1 = microtime_float();
- echo 'convertUnderline1: run time = ';
- echo $e1-$s1;echo '<br />';
-
- //第2種方式調(diào)用10w次所需時間
- $s2 = microtime_float();
- for ($i=0;$i<$counts;$i++)
- {
- $str= 'abcd_efgh_igk_lmn';
- convertUnderline2($str);
- }
- $e2 = microtime_float();
- echo 'convertUnderline2: run time = ';
- echo $e2-$s2;echo '<br />';
-
- //第3種方式調(diào)用10w次所需時間
- $s2 = microtime_float();
- for ($i=0;$i<$counts;$i++)
- {
- $str= 'abcd_efgh_igk_lmn';
- convertUnderline3($str);
- }
- $e2 = microtime_float();
- echo 'convertUnderline3: run time = ';
- echo $e2-$s2;echo '<br />';
-
- //第4種方式調(diào)用10w次所需時間
- $s2 = microtime_float();
- for ($i=0;$i<$counts;$i++)
- {
- $str= 'abcd_efgh_igk_lmn';
- convertUnderline4($str);
- }
- $e2 = microtime_float();
- echo 'convertUnderline4: run time = ';
- echo $e2-$s2;echo '<br />';
-
- //第5種方式調(diào)用10w次所需時間
- $s2 = microtime_float();
- for ($i=0;$i<$counts;$i++)
- {
- $str= 'abcd_efgh_igk_lmn';
- convertUnderline4($str);
- }
- $e2 = microtime_float();
- echo 'convertUnderline5: run time = ';
- echo $e2-$s2;echo '<br />';
復制代碼 為什么我要寫5個呢?不同的處理方式,我是想看看那個處理效率高。
經(jīng)過測試發(fā)現(xiàn),效率由高到低為 方法3>方法2>方法1>方法4>方法5 當然這是每個函數(shù)執(zhí)行10w次才能看出的結果,當然1w次也能看出差別,1次就可以忽略不計了。
下面是測試結果:
執(zhí)行1K次:
convertUnderline1: run time = 0.005000114440918
convertUnderline2: run time = 0.0040009021759033
convertUnderline3: run time = 0.0039999485015869
convertUnderline4: run time = 0.014001131057739
convertUnderline5: run time = 0.01600193977356
執(zhí)行1w次:
convertUnderline1: run time = 0.056005954742432
convertUnderline2: run time = 0.033003091812134
convertUnderline3: run time = 0.028002977371216
convertUnderline4: run time = 0.14401507377625
convertUnderline5: run time = 0.13701295852661
執(zhí)行10w次:
convertUnderline1: run time = 0.44704508781433
convertUnderline2: run time = 0.32203197479248
convertUnderline3: run time = 0.2670259475708
convertUnderline4: run time = 1.3601360321045
convertUnderline5: run time = 1.3231329917908
為什么字符串截取拼接要比數(shù)組連接慢呢?如果你看過PHP C的底層你就會明白了。所以以后如果有大量的字符串需要連接成一個字符串的 不要在用點連接了,放在一個數(shù)組后使用implode連接。
還有一個要說的,這樣的方法同樣在JS里也是,數(shù)組連接要比字符串連接塊。
前面3個方法是我想出來的,后面的正則抄襲可愛的網(wǎng)友們的,不過我也是挺佩服的,算是溫習了一下正則。
——在青春的路上,我們與你攜手共進! |
|