PHP 數字縮短(最多1倍)與還原

                                                     PHP 數字縮短(最多1倍)與還原

 

一、前言

  • 這個方法我不能保證沒問題,因爲沒有測那麼全。
  • 我寫這個呢,就是讓大家看一下,也是自己記錄一下,以後可以看一下
  • 如有錯誤之處,望批評指正,不吝賜教,感激涕零

二、效果

三、代碼

public function test(){
        $numbers = [
            10000,  //這第一個縮短後的 [ Ⅰ0~0 ] 好像有點長,怕是不止4位,,,
            123123,
            2564786,
            87979787967,
            6796567457
        ];

        foreach ($numbers as $number){
            $this->lookData($number);
        }
        die;
    }

    public function lookData($number){
        // 縮短數字:最多縮短一倍(僅限於縮短數字)
        $short = $this->short((string)$number); // 數字轉爲字符串,如果最後一個爲0,且個數爲單數,會出問題

        // 數字還原
        $long = $this->reduce($short);

        echo "原值: [ {$number} ]<br/>";
        echo "還原: [ {$long} ]<br/>";
        echo "縮短: [ {$short} ]<br/><br/>";
    }

    /**
     * 縮短數字:最多縮短一倍(僅限於縮短數字)
     * @param $data
     * @return string
     */
    public function short($data){
        $string = $lastString = '';
        $array = str_split($data, 2); // 字符串2個一切割,即每個元素的取值範圍爲[10,99]

        // 如果分割後最後一位值小於10,可以認爲這個數字的個數是單數,拼接上標識符 ~
        $endNumber = end($array);
        if ($endNumber < 10){    //獲取最後一位
            $lastString = '~' . $endNumber;
            array_pop($array);  //刪除最後一個元素
        }

        $mapping = $this->numberAssocChar();    // 數字關聯單個字符

        // 拼接數字對應的字符
        foreach ($array as $value){
            $string .= $mapping[$value];
        }

        return $string . $lastString;
    }

    /**
     * 還原數據
     * @param $data
     * @return string
     */
    public function reduce($data){
        $string = $lastString = '';
        $array = explode('~', $data);   //判斷數據個數是否爲單數,有~符號,說明原數據的個數爲單數

        $mapping = $this->numberAssocChar('charToNumber');   // 單個字符關聯數字

        // 拼接字符對應的數字
        $jieMiString = $array[0];
        $length = mb_strlen($jieMiString);  //mb_strlen:用來計算亂碼情況下的長度,我這裏是羅馬數字亂碼了
        for($i = 0; $i < $length; $i++) {
            //執行
//            $string .= $mapping[$jieMiString[$i]];    //如果有 [00, 09],異常,因爲羅馬字符不算是英文符號
            $string .= $mapping[mb_substr($jieMiString, $i, 1)];    //用來計算亂碼情況下的偏移量

            //調試用
//            echo $mapping[$jieMiString[$i]] . '<br/>';
        }

        // 拼接上最後一個落單的數字
        if (count($array) == 2){
            $string .= $array[1];
        }

        return $string;
    }

    /**
     * 數字關聯單個字符
     * @param string $type numberToChar:數字對應字符;charToNumber:字符對應數字
     * @return array|null 關聯數組
     */
    public function numberAssocChar($type = 'numberToChar'){
        // 初始化數組
        $intArray = $luomaArray = $lowerArray = $upperArray = $specialArray = [];

        // 循環數據 [00,99]
        for ($i = 0; $i < 100; $i++){
            if ($i < 10){   // 賦值 [0,9]
                if (empty($intArray)){
                    for ($j = 0; $j < 10; $j++){
                        $intArray['0' . $j] = $j;   //加上0,用於匹配拆分後的數字:00,01,02,03,04,05,06,07,08,09
                    }
                }
            }else if($i < 20){ //賦值 [10,19]
                if (empty($luomaArray)){
                    $tempArray = ['Ⅰ','Ⅱ','Ⅲ','Ⅳ','Ⅴ','Ⅵ','Ⅶ','Ⅷ','Ⅸ','Ⅹ'];
                    $length = count($tempArray);
                    for ($j = 0; $j < $length; $j++){
                        $luomaArray[10+$j] = $tempArray[$j];
                    }
                }

            } else if ($i < 46){ // 賦值 [a,z]
                if (empty($lowerArray)){
                    $index = 0;
                    for ($j = ord('a'); $j <= ord('z'); $j++){
                        $lowerArray[20+$index] =  chr($j);
                        $index ++;
                    }
                }
            }else if ($i < 72){ // 賦值 [A,Z]
                if (empty($upperArray)){
                    $index = 0;
                    for ($j = ord('A'); $j <= ord('Z'); $j++){
                        $upperArray[46+$index] = chr($j);
                        $index ++;
                    }
                }
            }else{  // 賦值特殊字符
                // '~':用於標識數字個數爲單數時
                // 以下2個字符在GET下可能會異常:'?', '&'
                $tempArray = [
                    '`', '!', '@', '#', '$', '%', '^', '*', '(',
                    ')', '-', '_', '=', '+', "\\", ',', '.', '<',
                    '>',  "'", '"', ';', '|', '[', ']', '{', '}', '/'
                ];
                $specialArray[$i] = $tempArray[$i - 72];
            }
        }

        //這裏用 + 拼接數組;array_merge()函數會把結果數組索引重置,我們希望保留索引。
        $result = $intArray + $luomaArray + $lowerArray + $upperArray + $specialArray;

        if ($type == 'charToNumber'){ //字符對應數字
            $result = array_flip($result);  // 數組的鍵值互換
        }

//        var_export($result);die;

        return $result;
    }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章