最近項目使用symfony框架,這個框架對數據庫的操做在這個團隊裏使用的是ORM進行操做,說實話使用ORM的開發效率和運行效率不必定高多少,到是它的實體命名和現有數據庫字段的命名不太同樣,ORM實體屬性命名是駝峯式的,數據庫字段是下劃線分隔,這就產生了字段映射的過程。當碰到須要手動寫實體必須的數組時,字段映射是一件很頭疼的事情,尤爲是字段比較多的時候,寫到你想吐。到這就產生一個問題就是把如下劃線分隔的命名字段轉換成駝峯式命名。小弟我也很懶,在網上找了半天,也沒找到一個具體的PHP Demo,有的也是java寫的,還着還挺複雜。因而乎我就本身動手豐衣足食,順手寫了幾個,廢話很少說直接貼代碼:php
<?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種方式調用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種方式調用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種方式調用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種方式調用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種方式調用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個呢?不一樣的處理方式,我是想看看那個處理效率高。
通過測試發現,效率由高到低爲 方法3>方法2>方法1>方法4>方法5 固然這是每一個函數執行10w次才能看出的結果,固然1w次也能看出差異,1次就能夠忽略不計了。
下面是測試結果:java
執行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數據庫
執行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數組
執行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框架
爲何字符串截取拼接要比數組鏈接慢呢?若是你看過PHP C的底層你就會明白了。因此之後若是有大量的字符串須要鏈接成一個字符串的 不要在用點鏈接了,放在一個數組後使用implode鏈接。函數
還有一個要說的,這樣的方法一樣在JS裏也是,數組鏈接要比字符串鏈接塊。測試
前面3個方法是我想出來的,後面的正則抄襲可愛的網友們的,不過我也是挺佩服的,算是溫習了一下正則。symfony