所謂的解碼也就是將編碼 (encoding) 過的小寫英文字母回覆成原來的英文小寫字母,由上圖可以看出,我們儲存表格所用的陣列依索引值 (index) 可推回原來的英文小寫字母,這是說,索引值 0 為 'q' ,所以是將原本的 'a' 變成 'q' ,因此,解碼就是依索引值重新加上位移值即可。
同樣需要用到巢狀迴圈 (nested loop) ,也就是在迴圈 (loop) 中有其他的迴圈。對單一英文句子而言,我們需要一個迴圈判斷每個字元是否為英文小寫字母,若是英文小寫字母,我們就需要另一個迴圈找出對應的索引值。由這樣的概念設計的解碼方法 (method) toDecode() ,如下
public function toDecode($s) { $r = Array(); $pattern = "/[a-z]/"; for ($i = 0; $i < strlen($s); $i++) { if (preg_match($pattern, $s[$i])) { for ($j = 0; $j < 26; $j++) { if ($s[$i] == $this->cArray[$j]) { array_push($r, $this->oArray[$j]); break; } } } else { array_push($r, $s[$i]); } } return join($r); }
幾乎跟 toEncode() 一模一樣,除了把 cArray 與 oArray 的上下位置對調外。
我們把 encryptdemo3.php 修改如下
<?php echo "<br / >"; $e = new Encrypt; echo "code: "; for ($i = 0; $i < 26; $i++) { echo $e->cArray[$i]; } echo "<br / >"; $input = "There is no spoon."; echo "input : ".$input."<br / >"; $r1 = $e->toEncode("There is no spoon."); echo "encode: ".$r1."<br / >"; $r2 = $e->toDecode($r1); echo "decode: ".$r2."<br / >"; echo "<br / ><br / >"; class Encrypt { public $cArray = Array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"); public $oArray = Array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"); function __construct() { shuffle($this->cArray); } function toEncode($s) { $r = Array(); $pattern = "/[a-z]/"; for ($i = 0; $i < strlen($s); $i++) { if (preg_match($pattern, $s[$i])) { for ($j = 0; $j < 26; $j++) { if ($s[$i] == $this->oArray[$j]) { array_push($r, $this->cArray[$j]); break; } } } else { array_push($r, $s[$i]); } } return join($r); } public function toDecode($s) { $r = Array(); $pattern = "/[a-z]/"; for ($i = 0; $i < strlen($s); $i++) { if (preg_match($pattern, $s[$i])) { for ($j = 0; $j < 26; $j++) { if ($s[$i] == $this->cArray[$j]) { array_push($r, $this->oArray[$j]); break; } } } else { array_push($r, $s[$i]); } } return join($r); } } /* 《程式語言教學誌》的範例程式 http://pydoing.blogspot.com/ 檔名:encryptdemo4.php 功能:示範 PHP 程式 作者:張凱慶 時間:西元 2012 年 11 月 */ ?>
我們來看看結果吧
編碼、解碼都沒問題了,但要 Encrypt 類別總是掛在程式裡總是不太好看,接下來,我們來組織程式碼檔案,將 Encrypt 分割到 encryptor.php 裡,再用 include() 函數引進測試!
中英文術語對照 | |
---|---|
解碼 | decoding |
編碼 | encoding |
索引值 | index |
巢狀迴圈 | nested loop |
迴圈 | loop |
方法 | method |
您可以繼續參考
網站篇
相關目錄
回 PHP 入門指南
回 PHP 教材
回首頁
參考資料
http://php.net/manual/en/language.oop5.php
http://www.php.net/manual/en/oop5.intro.php
http://www.php.net/manual/en/language.oop5.basic.php
http://php.net/manual/en/function.strlen.php
http://php.net/manual/en/function.preg-match.php
http://www.php.net/manual/en/function.join.php
沒有留言:
張貼留言