Heim Backend-Entwicklung PHP-Tutorial 使用PHP把下划线分隔定名的字符串 转换成驼峰式命名方式 , 把下划线后面的第一个字母变成大写

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

Jun 13, 2016 pm 12:22 PM
str time

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

最近项目使用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 />';
Nach dem Login kopieren

  

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

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Monotone Taktverarbeitung des Zeitpakets Monotone Taktverarbeitung des Zeitpakets Aug 04, 2023 pm 05:45 PM

Monotone Taktverarbeitung des Zeitpakets

So verwenden Sie die Java8 Time API So verwenden Sie die Java8 Time API Apr 28, 2023 pm 12:25 PM

So verwenden Sie die Java8 Time API

Was sind die Gemeinsamkeiten und Unterschiede zwischen __str__ und __repr__ in Python? Was sind die Gemeinsamkeiten und Unterschiede zwischen __str__ und __repr__ in Python? Apr 29, 2023 pm 07:58 PM

Was sind die Gemeinsamkeiten und Unterschiede zwischen __str__ und __repr__ in Python?

In Python integrierte Quellcodeanalyse vom Typ str In Python integrierte Quellcodeanalyse vom Typ str May 09, 2023 pm 02:16 PM

In Python integrierte Quellcodeanalyse vom Typ str

So erhalten und konvertieren Sie Zeit im Python-Zeitmodul So erhalten und konvertieren Sie Zeit im Python-Zeitmodul May 13, 2023 pm 12:19 PM

So erhalten und konvertieren Sie Zeit im Python-Zeitmodul

Was ist der Unterschied und die Verwendung zwischen Zeit und Datum/Uhrzeit in Python? Was ist der Unterschied und die Verwendung zwischen Zeit und Datum/Uhrzeit in Python? May 02, 2023 am 11:01 AM

Was ist der Unterschied und die Verwendung zwischen Zeit und Datum/Uhrzeit in Python?

Wie behebe ich den Fehler „undefiniert: time.After' in Golang? Wie behebe ich den Fehler „undefiniert: time.After' in Golang? Jun 25, 2023 pm 05:28 PM

Wie behebe ich den Fehler „undefiniert: time.After' in Golang?

Verwenden Sie die PHP-Funktion „time', um den aktuellen UNIX-Zeitstempel zurückzugeben Verwenden Sie die PHP-Funktion „time', um den aktuellen UNIX-Zeitstempel zurückzugeben Jul 25, 2023 pm 04:42 PM

Verwenden Sie die PHP-Funktion „time', um den aktuellen UNIX-Zeitstempel zurückzugeben

See all articles