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

Chinaunix

標(biāo)題: 使用PHP把下劃線分隔命名的字符串 轉(zhuǎn)換成駝峰式命名方式 , 把下劃線后面的第一個(gè)字母 [打印本頁(yè)]

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

  8. //將下劃線命名轉(zhuǎn)換為駝峰式命名
  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. //將下劃線命名轉(zhuǎn)換為駝峰式命名
  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. //將下劃線命名轉(zhuǎn)換為駝峰式命名
  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. //將下劃線命名轉(zhuǎn)換為駝峰式命名
  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. //將下劃線命名轉(zhuǎn)換為駝峰式命名
  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次所需時(shí)間
  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次所需時(shí)間
  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次所需時(shí)間
  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次所需時(shí)間
  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次所需時(shí)間
  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 />';
復(fù)制代碼
為什么我要寫5個(gè)呢?不同的處理方式,我是想看看那個(gè)處理效率高。
經(jīng)過測(cè)試發(fā)現(xiàn),效率由高到低為   方法3>方法2>方法1>方法4>方法5  當(dāng)然這是每個(gè)函數(shù)執(zhí)行10w次才能看出的結(jié)果,當(dāng)然1w次也能看出差別,1次就可以忽略不計(jì)了。
下面是測(cè)試結(jié)果:

執(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的底層你就會(huì)明白了。所以以后如果有大量的字符串需要連接成一個(gè)字符串的 不要在用點(diǎn)連接了,放在一個(gè)數(shù)組后使用implode連接。

還有一個(gè)要說的,這樣的方法同樣在JS里也是,數(shù)組連接要比字符串連接塊。

前面3個(gè)方法是我想出來(lái)的,后面的正則抄襲可愛的網(wǎng)友們的,不過我也是挺佩服的,算是溫習(xí)了一下正則。

——在青春的路上,我們與你攜手共進(jìn)!




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2