PHP 實現字串翻轉(包含中文漢字)的實現

唐成勇發表於2019-02-16

包含漢字字串亂碼

PHP面試題,題目很短,也很常見,但更容易出錯,題目如下

如何實現字串翻轉?
  第一反應,當然是strrev函式啦,這麼容易的題目還放在面試裡考,真不嫌麻煩啊?但是看了網上的答案後,發現自己錯了~~~

  strrev函式對英文很好用,直接可以實現字串翻轉,但是面對中文呢?肯定都是亂碼,對於這樣的問題有很多,比如strstr,substr等函式都是這樣的。還好PHP提供了mb_類的函式實現不同編碼、不同語言之間的相互轉換等操作。下面是我寫的PHP字串翻轉函式(mb_類的函式需要開啟一個mb_string實現)。

解決方案

程式碼:

<?php
header("content-type:text/html;charset=utf-8");
/**
    strrev() 函式反轉字串。
    語法
    strrev(string)
    引數 描述
    string 必需。規定要反轉的字串。
 */

/**
此函式的作用是反轉中文字串
mb_strlen() 獲取字元的長度
mb_substr() 獲取字元的單個元素
krsort() 按照鍵值逆序排序陣列,對關聯陣列按照鍵名進行降序排序
Array ( [8] => 國 [7] => 中 [6] => h [5] => s [4] => i [3] => l [2] => g [1] => n [0] => E ) English中國->國中hsilgnE
(ksort()對關聯陣列按照鍵名進行升序排序)
implode() 將陣列拼接為字串
explode() 使用字串分隔字串
 */
function str_rev_gb($str){
    //判斷輸入的是不是utf8型別的字元,否則退出
    if(!is_string($str)||!mb_check_encoding($str,`UTF-8`)){
        exit("輸入型別不是UTF8型別的字串");
    }
    $array=array();
    //將字串存入陣列
    $l=mb_strlen($str,`UTF-8`);//在mb_strlen計算時,選定內碼為UTF8,則會將一箇中文字元當作長度1來計算
    for($i=0;$i<$l;$i++){
        $array[]=mb_substr($str,$i,1,`UTF-8`);
    }
    //反轉字串
    krsort($array);
    //拼接字串
    $string=implode($array);
    return $string;
}
$str1 = "Englist";
$str2 = "English中國";
$str3 = "Eng中lish國";
$str4 = "中華人民共和國";
echo `直接用PHP自帶strrev函式反轉:`.`<br />`;
echo $str1."->".strrev($str1)."<br>";
echo $str2."->".strrev($str2)."<br>";
echo $str3."->".strrev($str3)."<br>";
echo $str4."->".strrev($str4)."<br>";
echo `<br />`;
echo $str1."->".str_rev_gb($str1)."<br>";
echo $str2."->".str_rev_gb($str2)."<br>";
echo $str3."->".str_rev_gb($str3)."<br>";
echo $str4."->".str_rev_gb($str4)."<br>";

執行結果:

直接用PHP自帶strrev函式反轉:
Englist->tsilgnE
English中國->��學�hsilgnE
Eng中lish國->���hsil���gnE
中華人民共和國->��匒居呰溺䎍學�

Englist->tsilgnE
English中國->國中hsilgnE
Eng中lish國->國hsil中gnE
中華人民共和國->國和共民人華中

需要注意的是,mb_strlen並不是PHP核心函式,使用前需要確保在php.ini中載入了php_mbstring.dll,即確保“extension=php_mbstring.dll”這一行存在並且沒有被註釋掉,否則會出現未定義函 數的問題。
參考文件:PHP 實現字串翻轉(包含中文漢字)

相關文章