免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2931 | 回复: 0
打印 上一主题 下一主题

使用PHP把下划线分隔命名的字符串 转换成驼峰式命名方式 , 把下划线后面的第一个字母 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-07-15 08:57 |只看该作者 |倒序浏览
最近项目使用symfony框架,这个框架对数据库的操作在这个团队里使用的是ORM进行操作,说实话使用ORM的开发效率和运行效率不一定高多少,到是它的实体命名和现有数据库字段的命名不太一样,ORM实体属性命名是驼峰式的,数据库字段是下划线分隔,这就产生了字段映射的过程。当碰到需要手动写实体必须的数组时,字段映射是一件很头疼的事情,尤其是字段比较多的时候,写到你想吐。到这就产生一个问题就是把以下划线分隔的命名字段转换成驼峰式命名。小弟我也很懒,在网上找了半天,也没找到一个具体的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种方式调用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种方式调用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种方式调用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种方式调用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种方式调用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个呢?不同的处理方式,我是想看看那个处理效率高。
经过测试发现,效率由高到低为   方法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个方法是我想出来的,后面的正则抄袭可爱的网友们的,不过我也是挺佩服的,算是温习了一下正则。

——在青春的路上,我们与你携手共进!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP