最近專案使用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); } //第一种方式调用10w次所需时间 $s1 = microtime_float(); for ($i=0;$i<1000;$i++) { $str= 'abcd_efgh_igk_lmn'; convertUnderline1($str); } $e1 = microtime_float(); echo 'convertUnderline1: run time = '; echo $e1-$s1;echo '<br />'; //第二种方式调用10w次所需时间 $s2 = microtime_float(); for ($i=0;$i<1000;$i++) { $str= 'abcd_efgh_igk_lmn'; convertUnderline2($str); } $e2 = microtime_float(); echo 'convertUnderline2: run time = '; echo $e2-$s2;
為什麼我要寫兩個呢?兩種不同的處理方式,我是想看看那個處理效率高。
經過測試發現,字串拼接的方式要比用數組來處理慢了0.1秒,當然這是每個函數執行10w次才能看出的結果,當然1w次也能看出差別,1次就可以忽略不計了。
下面是測試結果:
執行1K次:
convertUnderline1: run time = 0.0050010681152344
convertUnderline2: run time = 0.0039999485015869485015869485015869485015869485015869 500602722168
執行10w次:
convertUnderline1: run time = 0.46304702758789
為什麼字串截取拼接要比陣列連接慢呢?如果你看過PHP C的底層你就會明白了。所以以後如果有大量的字串需要連接成一個字串的 不要在用點連接了,放在一個數組後使用implode連接。
以上就介紹了使用PHP把下劃線分隔命名的字符串 轉換成駝峰式命名方式 , 把下劃線後面的第一個字母變成大寫,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。