最近项目使用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);
} //将下划线命名转换为驼峰式命名
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次就可以忽略不计了。
下面是测试结果:

执行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个方法是我想出来的,后面的正则抄袭可爱的网友们的,不过我也是挺佩服的,算是温习了一下正则。

最新文章

  1. Nginx添加到windows服务
  2. 开启Java博客
  3. 类的继承和多态性-编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name,腿的数量legs,统计动物的数量 count;方法:设置动物腿数量的方法 void setLegs(),获得腿数量的方法 getLegs(),设置动物名称的方法 setKind(),获得动物名称的方法 getKind(),获得动物数量的方法 getCount()。定义Fish类,是Animal类的子类,
  4. iOS -- cocopods使用
  5. android 一条线
  6. 【Software Clone】2014-IEEE-Towards a Big Data Curated Benchmark of Inter-Project Code Clones
  7. swift学习笔记之-下标脚本
  8. php设置和获取cookie
  9. POJ 2318 TOYS(计算几何)
  10. uCOS-II任务的挂起和恢复
  11. JS 控制 form是否提交表单
  12. Qt 操作 pdf 文件
  13. 一个简单的java贷款程序
  14. 推荐大家在GitHub 上值得关注学习的 iOS 开源项目
  15. 什么是IIS ?
  16. [iOS]创建界面方法的讨论
  17. 异常 try – finally 注意的地方
  18. [administrator] rpmbuild
  19. set方法在set传入值时报空指针异常,直接设置定值即可
  20. 深入解析QML引擎, 第4部分: 自定义解析器

热门文章

  1. python描述符学习
  2. vs2010 编译 boost1.65.1
  3. Bug解决方案:org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 8; 不允许有匹配 &quot;[xX][mM][lL]&quot; 的处理指令目标
  4. VMware里Ubuntu-14.04-desktop的VMware Tools安装图文详解
  5. thumbnailator + webp-imageio-core实现java处理图片支持webp
  6. UTF8最好不要带BOM,附许多经典评论
  7. xcode发布ipa
  8. 深度学习(五)正则化之L1和L2
  9. 【转】Eclipse,MyEclipse快捷键及字体设置
  10. 第N次学习javaIO之后