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;
}