2012-07-21 109 views
0

我是一個相當新手,當涉及到PHP,我想嘗試一些東西,但我絕對不知道我該如何做到這一點..說實話,我不知道是否可以解釋這個給你很清楚無論是..讓我們開始..在PHP中生成隨機值

我有幾個字母,例如A,b,C,d和e ..

併爲他們每個人我有兩個了表徵值的夫妻像這樣:

一個 - > FG,DZ,GC,BG

乙 - > ZT,HG,OQ,VG,GB

Ç - > LT,PR,CS,SH,PR

d - >克拉,NT,如,PR

ë - > ZD,KE,CG,平方,MO,LD

問題來了:

我想獲得每次例如,對於一個隨機值:dcbae 併爲此最終的輸出應該是這樣的:ntshztdzld或asltvggcmo .. (生成一個隨機的後字符串與上面的charachters(在a- e),我應該生成另一個字符串,其中包含與每個字符相關的隨機值。 這不是一個家庭作業或類似的東西。

預先感謝您的理解..

+1

加密是不是隨機 – 2012-07-21 17:49:54

+0

對不起我的壞。布蒂希望你明白了。 – jamall55 2012-07-21 17:51:18

+0

@ColeJohnson OTPs乞求不同。 – 2012-07-21 17:54:42

回答

3

那麼,你會首先創建一個映射:

$map = Array(
    "a" => Array("fg","dz","gc","bg"), 
    "b" => Array("zt","hg","oq","vg","gb"), 
    "c" => Array("lt","pr","cs","sh","pr"), 
    "d" => Array("kt","nt","as","pr"), 
    "e" => Array("zd","ke","cg","sq","mo","ld") 
); 

我注意到你有相同的對「公關」多次 - 如果你想要這個編碼是可逆的,避免重複。

無論如何,一旦你擁有了它是很容易來循環您輸入的字符串,並獲得一個隨機輸出:

$input = "dcbae"; 
$len = strlen($input); 
$output = ""; 
for($i=0; $i<$len; $i++) { 
    $entry = &$map[$input[$i]]; 
    if(isset($entry)) $output .= $entry[mt_rand(0,count($entry)-1)]; 
    else $output .= "??"; 
} 

$output是結果。

+0

+1,只是勉強打敗我:} – 2012-07-21 17:54:10

+0

謝謝你,是的。這是我的錯誤。在不同的陣列中不應該有任何一對。順便說一下,輸入也應該是自我生成的。 – jamall55 2012-07-21 17:56:33

+0

我編輯使用'mt_rand',因爲它好得多 – galymzhan 2012-07-21 17:57:52

1
<?php 

// Setup matching values 
$encpairs[ 'a' ] = array('fg', 'dz', 'gc', 'bg'); 
$encpairs[ 'b' ] = array('zt', 'hg', 'oq', 'vg', 'gb'); 
$encpairs[ 'c' ] = array('lt', 'pr', 'cs', 'sh', 'pr'); 
// etc. etc. 

// Define input string 
$my_string = 'abc'; 

// To randomly build input string 
$my_string = ''; 
$last_key = ''; 
$key = ''; 
$keys = array_keys($encpairs); 
$ttl_keys = count($keys) -1; 

// Generate the input string at random; change "5" to length you desire 
for ($j=0; $j < 5; $j++){ 
    // Randomly select a key from $encpairs array (giving you one letter at random) 
    // The while loop ensures no two letters are used consecutively 
    while ($key == $last_key) { 
     $key =$keys[ rand(0, $ttl_keys) ]; 
    } 
    $last_key = $key; 
    $my_string .= $key; 
} 

// Determine input string length 
$length = strlen($my_string); 

// Loop through each letter 
$output = ''; 
for($i=0; $i < $length; $i++){ 
    shuffle($encpairs[ $my_string[$i] ]); 
    $output.= $encpairs[ $my_string[$i] ][0]; // Added [0] 
} 
+0

當我使用這一個,輸出只打印「ArrayArrayArray」..多數民衆贊成在.. – jamall55 2012-07-21 18:22:07

+1

我的錯誤,倒數第二行應該有[0]追加:) – 2012-07-21 18:46:11

+0

謝謝。可能是我是一個douchebag,但我有最後兩件事.. 首先,我怎麼可以使我在數組中的字母自我生成$ my_string? (例如在abc之間) 其次,當我們生成$ my_string時,有沒有辦法阻止重複? abc bca bac cba cab是好的..但aac bab cac不是.. – jamall55 2012-07-21 18:55:12

0

通過初始化循環外的第二個字符串開始。將原始字符串(要加密)轉換爲數組,然後遍歷整個數組並追加到第二個字符串。 所以,你得到

$splitstr=str_split($original); 
$final_string=""; 
$map=Array(/**/); 
foreach($splitstr as $char) 
{ 
    $final_string.=$map[$char][rand(0,count($map[$char])-1)]; 
} 
return $final_string;