2012-07-21 62 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;