PHP字符串反转处理常用算法

博客分类: php 阅读次数: comments

PHP字符串反转处理常用算法

面试中常遇到问字符翻转算法的实现,我做了如下整理.

自带函数介绍

字符串反转函数 [strrev]

php 自带反转字符串函数 (PHP4,PHP5,PHP7)

string strrev ( string $string ) 参数,string待反转的原始字符串; 返回值,string 反转后的字符串。

范例

Example #1 使用 strrev() 反转字符串

<?php
    echo strrev("Hello world!"); // 输出 "!dlrow olleH"
?>

源码


PHP_FUNCTION(strrev)
{
zend_string *str;
char *e, *p;
        zend_string *n;

        ZEND_PARSE_PARAMETERS_START(1, 1)
                Z_PARAM_STR(str)
        ZEND_PARSE_PARAMETERS_END();

        n = zend_string_alloc(ZSTR_LEN(str), 0);
        p = ZSTR_VAL(n);

        e = ZSTR_VAL(str) + ZSTR_LEN(str);

        while (--e >= ZSTR_VAL(str)) {
            *p++ = *e;
        }

        *p = '\0';

        RETVAL_NEW_STR(n);
}

循环遍历法

1.1 for ++

function revStr11($str)
{
    if ($str == '') {
        return NULL;
    }
    $len = strlen($str);
    $new_str = '';
    for($i=1;$i<=$len;$i++){
        $new_str .= $str[$len-$i];
    }
    return $new_str;
}

1.2 for –

function revStr12($str)
{
    if ($str == '') {
        return NULL;
    }
    $len = strlen($str) - 1;
    $new_str = '';
    for($i=$len;$i>=0;$i--){
        $new_str .= $str[$i];
    }
    return $new_str;
}

首尾互换法

2.1

function revStr21($str)
{
    if ($str == '') {
        return NULL;
    }
    $len = strlen($str);
    $idx = $len / 2;
    for ($i=0;$i<$idx;$i++){
        $tmp = $str[$i];
        $end = $len - 1 - $i;
        $str[$i]   = $str[$end];
        $str[$end] = $tmp;
    }

    return $str;
}

PHP函数组合处理

3.1 substr函数处理-递归

function revStr31($str)
{
    if(strlen($str)>0){
        revStr31(substr($str,1));
    }
    echo substr($str,0,1);

    return NULL;
}

3.2 substr函数处理-循环

function revStr32($str)
{
    if ($str == '') {
        return NULL;
    }
    if(strlen($str) == 1){
        return $str;
    }else{
        $len = strlen($str);
        $rev_str = "";
        for($i=1; $i<=$len; $i++){
            $rev_str .= substr($str,-$i,1);
        }
        return $rev_str;
    }
}

3.2 str_split函数 + 循环

function revStr33($str)
{
    $rev_str = '';
    $str_arr = str_split($str);
    $arr_len = count($str_arr);
    for ($i=0; $i <= $arr_len; $i++) {
        $rev_str .= $str_arr[$arr_len - $i];
    }

    return $rev_str;
}

3.2 str_split函数 + array_reverse函数 + implode函数

function revStr35($s)
{
    return implode('',array_reverse(str_split($s)));
}

正则表达式处理

注:该方式也可以用来处理中文

4.1 array_reverse函数 + preg_split函数 + join函数

function revStr41($str)
{
    return join("",array_reverse(preg_split("//u",$str)));
}

4.1 array_reverse函数 + preg_match_all函数 + join函数

function revStr42($str)
{
    preg_match_all('/./us', $str, $ar);
    return join('',array_reverse($ar[0]));
}

中文反转实现

5.1 mb_substr函数 + for循环

function revstr51($str, $encoding = 'UTF-8')
{
    $len = mb_strlen($str) - 1;
    $res = '';
    for ($i = $len; $i>=0; $i--){
        $res.= mb_substr($str,$i,1,$encoding);
    }

    return $res;
}

5.2 mb_substr函数 + krsort函数 + implode函数

function revStr52($str, $encoding = 'UTF-8')
{
    //判断输入的是不是utf8类型的字符,否则退出
    if(!is_string($str) || !mb_check_encoding($str,$encoding)){
        return NULL;
    }

    $arr = [];
    $len = mb_strlen($str,$encoding);
    for($i=0; $i<$len; $i++){
        $arr[] = mb_substr($str,$i,1,$encoding);
    }
    //反转字符串
    krsort($arr);
    //拼接字符串
    $rev_str = implode('',$arr);

    return $rev_str;
}

5.3 mb_substr函数 + while循环

function revStr53 ($str, $encoding = 'UTF-8')
{
    $len = mb_strlen($str, $encoding);
    $rev_str = '';
    while($len-- > 0) {
        $rev_str .= mb_substr($str, $len, 1, $encoding);
    }
    return $rev_str;
}