我正在為我的網站寫一個也能夠旋轉數字的函式,並且不斷擴充它。我添加了額外的字元、以百分比定義位移的功能,以及要影響哪種類型的字元。
<?php
function str_shift ($string, $perc=50, $useextra=FALSE, $usedigits=TRUE, $useupper=TRUE, $uselower=TRUE) {
static $chars = array(
'lower' => 'abcdefghijklmnopqrstuvwxyz',
'upper' => 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'digits' => '0123456789',
'extra' => ',.-()<>%/!"&=;:_[]{}#\\?\'+*',
);
settype($perc, 'float');
if (!$perc) return $string;
$perc = fmod((abs($perc) < 1 ? 100*$perc : $perc), 100);
if ($perc < 0) $perc += 100;
$use = (is_array($useextra) ? $useextra : array('lower'=>$uselower, 'upper'=>$useupper, 'digits'=>$usedigits, 'extra'=>$useextra));
foreach ($chars as $type => $letters) {
if (!$use[$type]) continue;
$shift = round(strlen($letters) * $perc / 100);
$repl = substr($letters, $shift).substr($letters, 0, $shift);
$string = strtr($string, $letters, $repl);
}
return $string;
}
string str_shift ( string $str [, float $percent [, bool $useextra [, bool $usedigits [, bool $uselower [, bool $useupper] ] ] ] ] )
string str_shift ( string $str [, float $percent [, array $usetypes ] ] )
$usetypes = array('lower'=>bool $uselower, 'upper'=>bool $useupper, 'digits'=>bool $usedigits, 'extra'=>bool $useextra);
$string = "Peter's 17 pets (incl. 5 hamsters) love Dr Sarah Gibson, DVM!";
echo str_shift($string);
echo str_shift($string, 50, TRUE);
echo str_shift($string, -25, FALSE, FALSE);
echo str_shift($string, 1/3);
echo str_shift($string, 50, array('lower'=>TRUE, 'digits'=>TRUE));
?>
//===== 結果 =====
Crgre'f 62 crgf (vapy. 0 unzfgref) ybir Qe Fnenu Tvofba, QIZ!
Crgre"f 62 crgf [vapy: 0 unzfgref] ybir Qe Fnenu Tvofba; QIZ?
Jynyl'm 17 jynm (相當於 5 bugmnylm) 來自 Xl Mulub Acvmih, XPG!
Yncna'b 40 yncb (大約 8 qjvbcnab) 來自 Ma Bjajq Prkbxw, MEV!
Prgre'f 62 crgf (大概是 0 unzfgref) 來自 De Snenu Gvofba, DVM!
1. 基本參數是字串和百分比,預設為 50。接下來的四個參數允許選擇要處理的字元類型。我先放比較少見的類型,最後放最常見的類型是有原因的。要啟用額外字元,您只需要 1 個額外的參數,否則您需要 4 個參數來啟用所有明顯的類型。
2. 字母和數字的定義很明顯。對於額外字元,我選擇了在偏移 50% 時有意義的成對字元,例如 () => [] 或 & => + 等。當然,您可以根據自己的喜好調整這些字元。
3. 第一步是清理百分比,並允許「真正的」浮點數,例如 1/3 表示 33.33%。
4. 下一步確保在使用函數時具有很大的靈活性。如上所述,您可以傳遞 1 個陣列而不是 4 個布林參數。例如,陣列('upper' => TRUE) 將僅啟用大寫字母的更改。
5. 最後,函數會遍歷每種類型,並根據給定的百分比偏移字元。
我希望您可以使用此函數並用它做一些有趣的事情。旋轉字元並沒有什麼實際意義,但它可能很有趣。
Arthur :-)