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

我们今天主要是来看一看golang time 包的时间应用方式。两者的一般规则是「wall time」用于告知时间,而「monotonic clock」用于测量时间;除外还有其他的时钟处理方式。

1.概述作为本文的一部分,让我们从现有Date和CalendarAPI存在的一些问题入手,来探讨新的Java8Date和TimeAPI如何解决这些问题。我们还将搞一搞Java8时间类库中的核心类,比如LocalDate,LocalTime,LocalDateTime,ZonedDateTime,Period,Duration以及它们的api。2.旧的时间API(java8之前)的问题线程安全-Date和Calendar类不是线程安全的,使开发者难以调试这些api的并发问题,需要编写额外的代码来处

Pythontime模块时间获取和转换Python的Time库可以进行时间相关的处理,如访问当前日期和时间,输出不同格式的时间以及等待指定的时间等。1.获取时间1.1.时间戳importtimetimestamp=time.time()#1682737552.5009851格林威治时间(GMT)1970年01月01日00时00分00秒起至现在的总秒数1.2.结构化时间importtimestruct_time=time.localtime()#time.struct_time(tm_year=2

1Unicode计算机存储的基本单位是字节,由8个比特位组成。由于英文只由26个字母加若干符号组成,因此英文字符可以直接用字节来保存。但是其他语言(例如中日韩等),由于字符众多,不得不使用多个字节来进行编码。随着计算机技术的传播,非拉丁文字符编码技术不断发展,但是仍然存在两个比较大的局限性:不支持多语言:一种语言的编码方案不能用于另外一种语言没有统一标准:例如中文就有GBK、GB2312、GB18030等多种编码标准由于编码方式不统一,开发人员就需要在不同编码之间来回转换,不可避免地会出现很多错

一.Python中表示时间的两种方式:时间戳:相对于1970.1.100:00:00以秒计算的偏移量,唯一的时间元组struct_time:共有9个元素>tm_year:年1-12>tm_mon:月1-12>tm_mday:日1-31>tm_hour:时0-23>tm_min:分0-59>tm_sec:秒0-59>tm_wday:星期0-6(0表示周日)>tm_day:一年中的第几天1-366>tm_isdst:是否是夏令,默认为-1二.ti

__str__和__repr__有什么异同?字符串的表示形式我们都知道,Python的内置函数repr()能够把对象用字符串的形式表达出来,方便我们辨认。这就是“字符串表示形式”。repr()就是通过__repr__这个特殊方法来得到一个对象的字符串表示形式的。如果没有实现__repr__,当我们在控制台里打印一个向量的实例时,得到的字符串可能会是。>>>classExample:pass>>>print(str(Example()))>>>

Golang是一门非常受欢迎的编程语言,其简单易学、高效快速的特性吸引了越来越多的开发者。但在使用中,不可避免地会遇到一些问题和错误。例如,使用time包中的After方法时,可能会遇到undefined:time.After的错误。本篇文章将为大家介绍如何解决这个错误。了解错误原因在Golang中,如果我们使用了一个未导出的函数名或未正

使用PHP函数"time"返回当前的UNIX时间戳UNIX时间戳是指从协调世界时(UTC)1970年1月1日0时0分0秒起至今的总秒数。在PHP中,可以使用内置函数"time"来获取当前的UNIX时间戳。本文将介绍如何使用这个函数,并提供相应的代码示例。代码示例:<?php$timestamp=time();echo"当前的


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

ホットトピック



