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

  • 相关阅读:
    JavaScript 的核心机制——event loop(最易懂版)
    关于敏捷讨论的感想
    前端,如何更优雅的面对异步
    广告行业中那些趣事系列10:推荐系统中不得不说的DSSM双塔模型
    书中自有黄金屋系列7:读《博世宁医学通识讲义》
    广告行业中那些趣事系列9:一网打尽Youtube深度学习推荐系统
    书中自有黄金屋系列6:读《浪潮之巅》-下篇
    书中自有黄金屋系列6:读《浪潮之巅》-上篇
    广告行业中那些趣事系列8:详解BERT中分类器源码
    书中自有黄金屋系列5:读《正面管教》
  • 原文地址:https://www.cnblogs.com/roam/p/6846862.html
Copyright © 2011-2022 走看看