PHP把底線分隔命名的字串與駝峰式命名互轉

來源:互聯網
上載者:User

標籤:mat   字串截取   方法   截取   func   ace   為什麼   count   函數   

最近項目使用symfony架構,這個架構對資料庫的操作在這個團隊裡使用的是ORM進行操作,說實話使用ORM的開發效率和運行效率不一定高多少,到是它的實體命名和現有資料庫欄位的命名不太一樣,ORM實體屬性命名是駝峰式的,資料庫欄位是底線分隔,這就產生了欄位對應的過程。當碰到需要手動寫實體必須的數組時,欄位對應是一件很頭疼的事情,尤其是欄位比較多的時候,寫到你想吐。到這就產生一個問題就是把以底線分隔的命名欄位轉換成駝峰式命名。小弟我也很懶,在網上找了半天,也沒找到一個具體的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種方式調用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次就可以忽略不計了。
下面是測試結果:

執行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個方法是我想出來的,後面的正則抄襲可愛的網友們的,不過我也是挺佩服的,算是溫習了一下正則。

PHP把底線分隔命名的字串與駝峰式命名互轉

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.