php 下划线转大写开头,使用PHP把下划线分隔命名的字符串 转换成驼峰式命名方式 , 把下划线后面的第一个字母变成大写...

最近项目使用symfony框架,这个框架对数据库的操作在这个团队里使用的是ORM进行操作,说实话使用ORM的开发效率和运行效率不一定高多少,到是它的实体命名和现有数据库字段的命名不太一样,ORM实体属性命名是驼峰式的,数据库字段是下划线分隔,这就产生了字段映射的过程。当碰到需要手动写实体必须的数组时,字段映射是一件很头疼的事情,尤其是字段比较多的时候,写到你想吐。到这就产生一个问题就是把以下划线分隔的命名字段转换成驼峰式命名。小弟我也很懒,在网上找了半天,也没找到一个具体的PHP Demo,有的也是java写的,还着还挺复杂。于是乎我就自己动手丰衣足食,顺手写了几个,废话不多说直接贴代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109<?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

{

$str='abcd_efgh_igk_lmn';

convertUnderline1($str);

}

$e1 = microtime_float();

echo 'convertUnderline1: run time = ';

echo $e1-$s1;echo '
';

//第2种方式调用10w次所需时间

$s2 = microtime_float();

for ($i=0;$i

{

$str='abcd_efgh_igk_lmn';

convertUnderline2($str);

}

$e2 = microtime_float();

echo 'convertUnderline2: run time = ';

echo $e2-$s2;echo '
';

//第3种方式调用10w次所需时间

$s2 = microtime_float();

for ($i=0;$i

{

$str='abcd_efgh_igk_lmn';

convertUnderline3($str);

}

$e2 = microtime_float();

echo 'convertUnderline3: run time = ';

echo $e2-$s2;echo '
';

//第4种方式调用10w次所需时间

$s2 = microtime_float();

for ($i=0;$i

{

$str='abcd_efgh_igk_lmn';

convertUnderline4($str);

}

$e2 = microtime_float();

echo 'convertUnderline4: run time = ';

echo $e2-$s2;echo '
';

//第5种方式调用10w次所需时间

$s2 = microtime_float();

for ($i=0;$i

{

$str='abcd_efgh_igk_lmn';

convertUnderline4($str);

}

$e2 = microtime_float();

echo 'convertUnderline5: run time = ';

echo $e2-$s2;echo '
';

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值