用从专用于找到的字母的数组中随机选择的字符串替换指定的字母

问题描述 投票:0回答:4

我有几封信;例如 a、b、c、d 和 e。

对于它们中的每一个,我都有一组像这样的两个字符值:

a -> fg、dz、gc、bg

b -> zt、hg、oq、vg、gb

c -> lt、pr、cs、sh、pr

d -> kt、nt、as、pr

e -> zd、ke、cg、sq、mo、ld

问题来了:

我想每次都获得一个随机值,例如:

dcbae
为此,最终输出应该是这样的:
ntshztdzld
asltvggcmo

(用上面的字符(a-e之间)生成随机字符串后,它应该生成另一个包含与每个字符相关的随机值的字符串。

php arrays random replace mapping
4个回答
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")
);

我注意到您多次拥有相同的“pr”对 - 如果您希望此编码可逆,请避免重复。

无论如何,一旦你有了它,就很容易循环输入字符串并获得随机输出:

$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
就是结果。


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
投票

首先在循环外初始化第二个字符串。将原始字符串(要加密)转换为数组,然后循环整个数组并附加到第二个字符串。 这样你就得到了

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

0
投票

此任务并不绝对需要

preg_
函数调用,但这样做有一些优点。由于随机翻译需要构建新字符串,因此
preg_replace_callback()
不需要手动连接到结果字符串。理想情况下,您决定使用的任何流程都应该足够强大,以便将来的维护只需要更新查找数组 - 处理脚本应该保持不变。

代码:(演示

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

$subpattern = implode('|', array_map('preg_quote', array_keys($map)));

echo preg_replace_callback(
         '#' . $subpattern . '#',
         fn($m) => $map[$m[0]][array_rand($map[$m[0]])],
         'dddcbae'
     );
© www.soinside.com 2019 - 2024. All rights reserved.