最近项目使用symfony框架,这个框架对数据库的操做在这个团队里使用的是ORM进行操做,说实话使用ORM的开发效率和运行效率不必定高多少,到是它的实体命名和现有数据库字段的命名不太同样,ORM实体属性命名是驼峰式的,数据库字段是下划线分隔,这就产生了字段映射的过程。当碰到须要手动写实体必须的数组时,字段映射是一件很头疼的事情,尤为是字段比较多的时候,写到你想吐。到这就产生一个问题就是把如下划线分隔的命名字段转换成驼峰式命名。小弟我也很懒,在网上找了半天,也没找到一个具体的PHP Demo,有的也是java写的,还着还挺复杂。因而乎我就本身动手丰衣足食,顺手写了几个,废话很少说直接贴代码:php
<?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次就能够忽略不计了。
下面是测试结果:java
执行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个方法是我想出来的,后面的正则抄袭可爱的网友们的,不过我也是挺佩服的,算是温习了一下正则。symfony