骆驼命名法转小写分隔

/**
 * API相关工具类
 *
 * @package service
 * @author lizengwang <lizengwang@gmail.com>
 * @version 0.1 2015-8-10 20:58:55
 * @copyright (C) 2015 lizengwang <lizengwang@gmail.com>
 */

class apiTools
{

    /**
     * 统一API对完的输出转换,主要为 array('CourseName'=>'demo','Course_Num'=>12) 转换为 array('course_name' => 'demo','course_num'=>12)
     * @param array $data 待转换数组
     * @param array $exclude 排除列表,例如:array('Course_Num'=>'COURSENUM') ,上述数组会转换为 array('course_name' => 'demo','COURSENUM'=>12)
     * @return array
     */
    public static function camelArray2LowerArray(array $data,array $exclude = array()) {

        $result = array();
        foreach ($data as $key=>$node) {

            //如果存在特殊处理的key,直接替换
            if (array_key_exists($key,$exclude) && !empty($exclude[$key])) {
                is_array($node) ? $result[$exclude[$key]] = self::camelArray2LowerArray($node,$exclude) : $result[$exclude[$key]] = $node;
            } else {
                $new_key = self::camelCase2SplitLower($key);
                is_array($node) ?  $result[$new_key] = self::camelArray2LowerArray($node,$exclude) : $result[$new_key] = $node;
            }

        }

        return $result;
    }

    /**
     * 分隔骆驼命名法,获取分隔后的小写字母,分隔符默认下划线
     * @param $str 待转换字符串
     * @param string $split_tag 分隔符
     * @return string
     */
    private static function camelCase2SplitLower($str,$split_tag = '_')
    {
        $result = '';
        $prev_code = 0;

        $str = strval($str);
        $str_length = strlen($str);
        $split_tag_code = ord($split_tag);

        for ($i = 0;$i<$str_length;$i++) {

            $ascii_code = ord($str[$i]);

            //如果是大写字母,转成小写字母,如果前一个字符为分隔符或者前一个字符为大写字母则不增加新的分隔符;
            if ($ascii_code >= 65 && $ascii_code <= 90) {
                if ($prev_code == 0
                    || $prev_code == $split_tag_code
                    ||($prev_code >= 65 && $prev_code <= 90)
                ) {
                    $result .= chr($ascii_code+32);
                } else {
                    $result .= $split_tag.chr($ascii_code+32);
                }

            } else {
                $result .= $str[$i];
            }

            $prev_code = $ascii_code;
        }

        return $result;

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值