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

使用PHP把下划线分隔命名的字符串 转换成驼峰式命名方式 , 把下划线后面的第一个字母变成大写的更多相关文章

  1. PHP把下划线分隔命名的字符串与驼峰式命名互转

    最近项目使用symfony框架,这个框架对数据库的操作在这个团队里使用的是ORM进行操作,说实话使用ORM的开发效率和运行效率不一定高多少,到是它的实体命名和现有数据库字段的命名不太一样,ORM实体属 ...

  2. php 把驼峰样式的字符串转换成下划线样式的字符串

    1.如何在php中把驼峰样式的字符串转换成下划线样式的字符串.例:输入是FooBar的话,输出则是foo_bar 以下是用正则的方式去完成,既然用到正则,方法肯定就不只一种,我们看下下面的方式 ech ...

  3. PHP面试题之驼峰字符串转换成下划线样式例子

    自己在看到这个问题的时候,想到的是用ASCII码来处理,没往万能的正则上去想.好吧,下面来看看答案: 答案1: 代码如下 复制代码 $str = 'OpenAPI'; $length = mb_str ...

  4. [Vue]Vue实例的选项props传递数据props为驼峰式命名

    在vue的中文官网有这样的说明: HTML 中的特性名是大小写不敏感的,所以浏览器会把所有大写字符解释为小写字符.这意味着当你使用 DOM 中的模板时,camelCase (驼峰命名法) 的 prop ...

  5. 使用SQL如何把用逗号等字符隔开的字符串转换成列表(转)

    如何把用逗号等字符隔开的字符串转换成列表,下面依逗号分隔符为例: 比如有一个字符串,其值为:香港,张家港,北京,上海用SQL把这个字符串转换成列表的方法是: 1.方法一 WITH A AS (SELE ...

  6. json字符串转换成json对象,json对象转换成字符串,值转换成字符串,字符串转成值

    一.json相关概念 json,全称为javascript object notation,是一种轻量级的数据交互格式.采用完全独立于语言的文本格式,是一种理想的数据交换格式. 同时,json是jav ...

  7. vue组件中camelCased (驼峰式) 命名与 kebab-case(短横线命名)

    HTML 特性是不区分大小写的.所以,当使用的不是字符串模版,camelCased (驼峰式) 命名的 prop 需要转换为相对应的 kebab-case (短横线隔开式) 命名: 如果你使用字符串模 ...

  8. [原创]SQL表值函数:把用逗号分隔的字符串转换成表格数据

      我们日常开发过程中,非常常见的一种需求,把某一个用逗号或者/或者其他符号作为间隔的字符串分隔成一张表数据. 在前面我们介绍了 [原创]SQL 把表中字段存储的逗号隔开内容转换成列表形式,当然按照这 ...

  9. Gson将字符串转换成JsonObject和JsonArray

    以下均利用Gson来处理: 1.将bean转换成Json字符串: public static String beanToJSONString(Object bean) { return new Gso ...

随机推荐

  1. Eclipse 浏览文件插件- OpenExplorer

    http://blog.csdn.net/w709854369/article/details/6599167 EasyExplorer  是一个类似于 Windows Explorer的Eclips ...

  2. C语言处理CSV文件的方法(一)

    什么是CSV文件 CSV是 Comma-separated values (逗号分隔值)的首字母缩写,它通常是以逗号且不仅限于逗号分隔各个值,我们都叫他CSV. 看下面的例子: China, Shan ...

  3. Customizing Zend Studio Using the Welcome Page

    Customizing Zend Studio Using the Welcome Page Zend Studio enables you to add or remove plugins from ...

  4. 实现php获取mp3文件元信息如播放时间歌曲作者等

    最近收集到一个php获取mp3文件元信息的类,感觉比较方便.现在分享给大家! 下面是使用方式和测试方式: <?php include_once 'mp3file.class.php'; func ...

  5. hdu 5654 xiaoxin and his watermelon candy 莫队

    题目链接 求给出的区间中有多少个三元组满足i+1=j=k-1 && a[i]<=a[j]<=a[k] 如果两个三元组的a[i], a[j], a[k]都相等, 那么这两个三 ...

  6. php命名空间使用

    对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...

  7. Umbraco安装权限问题

    当安装或升级,甚至是使用Umbraco时,如果出现一些莫名其妙的问题. 估计都是权限出了问题,用心参考下文: https://our.umbraco.org/documentation/Getting ...

  8. 信号和槽有一个非常精炼的C++实现,作者是Sarah Thompson,该实现只有一个头文件sigslot.h,跨平台且线程安全

    关于信号和槽有一个非常精炼的C++实现,作者是Sarah Thompson,该实现只有一个头文件sigslot.h,跨平台且线程安全. 源码在:http://sigslot.cvs.sourcefor ...

  9. perl 跨行匹配;

    <pre name="code" class="html"><pre name="code" class="ht ...

  10. 字符串匹配——KMP算法

    关于KMP算法的分析,我觉得这两篇博客写的不错: http://www.ruanyifeng.com/blog/2013/05/Knuth–Morris–Pratt_algorithm.html ht ...