亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2998 | 回復: 0
打印 上一主題 下一主題

使用PHP把下劃線分隔命名的字符串 轉換成駝峰式命名方式 , 把下劃線后面的第一個字母 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2015-07-15 08:57 |只看該作者 |倒序瀏覽
最近項目使用symfony框架,這個框架對數(shù)據(jù)庫的操作在這個團隊里使用的是ORM進行操作,說實話使用ORM的開發(fā)效率和運行效率不一定高多少,到是它的實體命名和現(xiàn)有數(shù)據(jù)庫字段的命名不太一樣,ORM實體屬性命名是駝峰式的,數(shù)據(jù)庫字段是下劃線分隔,這就產(chǎn)生了字段映射的過程。當碰到需要手動寫實體必須的數(shù)組時,字段映射是一件很頭疼的事情,尤其是字段比較多的時候,寫到你想吐。到這就產(chǎn)生一個問題就是把以下劃線分隔的命名字段轉換成駝峰式命名。小弟我也很懶,在網(wǎng)上找了半天,也沒找到一個具體的PHP Demo,有的也是java寫的,還著還挺復雜。于是乎我就自己動手豐衣足食,順手寫了幾個,廢話不多說直接貼代碼:
  1. <?php
  2. //微妙時間
  3. function microtime_float()
  4. {
  5.     list($usec, $sec) = explode(" ", microtime());
  6.     return ((float)$usec + (float)$sec);
  7. }

  8. //將下劃線命名轉換為駝峰式命名
  9. function convertUnderline1 ( $str , $ucfirst = true)
  10. {
  11.     while(($pos = strpos($str , '_'))!==false)
  12.         $str = substr($str , 0 , $pos).ucfirst(substr($str , $pos+1));

  13.     return $ucfirst ? ucfirst($str) : $str;
  14. }

  15. //將下劃線命名轉換為駝峰式命名
  16. function convertUnderline2 ( $str , $ucfirst = true)
  17. {
  18.     $str = explode('_' , $str);
  19.     foreach($str as $key=>$val)
  20.         $str[$key] = ucfirst($val);

  21.     if(!$ucfirst)
  22.         $str[0] = strtolower($str[0]);

  23.     return implode('' , $str);
  24. }

  25. //將下劃線命名轉換為駝峰式命名
  26. function convertUnderline3 ( $str , $ucfirst = true)
  27. {
  28.     $str = ucwords(str_replace('_', ' ', $str));
  29.     $str = str_replace(' ','',lcfirst($str));
  30.      return $ucfirst ? ucfirst($str) : $str;
  31. }

  32. //將下劃線命名轉換為駝峰式命名
  33. function convertUnderline4 ( $str , $ucfirst = true)
  34. {
  35.     $str = preg_replace('/_([A-Za-z])/e',"strtoupper('$1')",$str);
  36.     return $ucfirst ? ucfirst($str) : $str;
  37. }

  38. //將下劃線命名轉換為駝峰式命名
  39. function convertUnderline5 ( $str , $ucfirst = true)
  40. {
  41.     $str = preg_replace_callback('/([-_]+([a-z]{1}))/i',function($matches){
  42.         return strtoupper($matches[2]);
  43.     },$str);
  44.     return $ucfirst ? ucfirst($str) : $str;
  45. }

  46. $counts = 100000;
  47. //第1種方式調(diào)用10w次所需時間
  48. $s1 = microtime_float();
  49. for ($i=0;$i<$counts;$i++)
  50. {
  51.     $str= 'abcd_efgh_igk_lmn';
  52.     convertUnderline1($str);
  53. }
  54. $e1 = microtime_float();
  55. echo 'convertUnderline1: run time = ';
  56. echo $e1-$s1;echo '<br />';

  57. //第2種方式調(diào)用10w次所需時間
  58. $s2 = microtime_float();
  59. for ($i=0;$i<$counts;$i++)
  60. {
  61.     $str= 'abcd_efgh_igk_lmn';
  62.     convertUnderline2($str);
  63. }
  64. $e2 = microtime_float();
  65. echo 'convertUnderline2: run time = ';
  66. echo $e2-$s2;echo '<br />';

  67. //第3種方式調(diào)用10w次所需時間
  68. $s2 = microtime_float();
  69. for ($i=0;$i<$counts;$i++)
  70. {
  71.     $str= 'abcd_efgh_igk_lmn';
  72.     convertUnderline3($str);
  73. }
  74. $e2 = microtime_float();
  75. echo 'convertUnderline3: run time = ';
  76. echo $e2-$s2;echo '<br />';

  77. //第4種方式調(diào)用10w次所需時間
  78. $s2 = microtime_float();
  79. for ($i=0;$i<$counts;$i++)
  80. {
  81.     $str= 'abcd_efgh_igk_lmn';
  82.     convertUnderline4($str);
  83. }
  84. $e2 = microtime_float();
  85. echo 'convertUnderline4: run time = ';
  86. echo $e2-$s2;echo '<br />';

  87. //第5種方式調(diào)用10w次所需時間
  88. $s2 = microtime_float();
  89. for ($i=0;$i<$counts;$i++)
  90. {
  91.     $str= 'abcd_efgh_igk_lmn';
  92.     convertUnderline4($str);
  93. }
  94. $e2 = microtime_float();
  95. echo 'convertUnderline5: run time = ';
  96. 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)友們的,不過我也是挺佩服的,算是溫習了一下正則。

——在青春的路上,我們與你攜手共進!
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP