使用字符串作为表来交换字母

时间:2015-03-20 16:13:36

标签: php

我正在尝试将一个句子中的每个字符更改为另一个字符以“编码”该句子(更像是让它变得不可读)。

想法是取这个字符串:“abc”并将其中的每个字符转换为字母表中的下一个字符,给出“bcd”。因此,当你到达终点时,'A'变为'B','Z'变为'A'。我创建了这个确实有效的代码,但前提是你试图将'B'转换为字母表中倒退的'A'。

这是有效的代码(将B变为A):

<?php
$SentenceToEncode="hello stackoverflow, this is my first question. thanks for helping!";
$Alphabet="abcdefghijklmnopqrstuvwxyz";
$ModifiedAlphabet="zabcdefghijklmnopqrstuvwxy";
$SentenceLength=strlen($SentenceToEncode);

for($i=0;$i<$SentenceLength;$i++){
    for($j=0;$j<26;$j++){   
        if($SentenceToEncode[$i]===$Alphabet[$j]){
            $SentenceToEncode[$i]=$ModifiedAlphabet[$j];
        }
    }
}
echo $SentenceToEncode;
?>

运行时会产生这种结果:

gdkkn rsybjnudqeknv, sghr hr lx ehqrs ptdrshnm. sgymjr enq gdkohmf!

但是当我尝试第二个阻止A变成B的时候(这就是我想要的):

<?php
$SentenceToEncode="hello stackoverflow, this is my first question. thanks for helping!";
$Alphabet="abcdefghijklmnopqrstuvwxyz";
$ModifiedAlphabet="bcdefghijklmnopqrstuvwxyza";
$SentenceLength=strlen($SentenceToEncode);

for($i=0;$i<$SentenceLength;$i++){
    for($j=0;$j<26;$j++){   
        if($SentenceToEncode[$i]===$Alphabet[$j]){
            $SentenceToEncode[$i]=$ModifiedAlphabet[$j];
        }
    }
}
echo $SentenceToEncode;
?>

我明白了:

aaaaa aaaaaaaaaaaaa, aaaa aa aa aaaaa aaaaaaaa. aaaaaa aaa aaaaaaa!

我哪里出错了?唯一的区别是修改后的字母表的第一个和最后两个字母。

提前致谢!

3 个答案:

答案 0 :(得分:2)

使用str_replace功能可以更轻松地完成。

$decoded = array("a", "b", "c", ...., "z"); 
$encoded = array("z", "a", "b", ...., "y"); 

$encoded_text = str_replace($decoded, $encoded, $original_text);

$decoded_text = str_replace($encoded, $decoded, $encoded_text);

您还可以使用str_split函数

从字符串创建初始数组

答案 1 :(得分:2)

您必须在if语句中添加break;(我会为两个脚本执行此操作以保存一些迭代)!像这样:

if($SentenceToEncode[$i]===$Alphabet[$j]) {     
    $SentenceToEncode[$i]=$ModifiedAlphabet[$j];
    break;
}

为什么?

因为如果你不这样做,它会为每个角色运行内循环26次!那意味着什么:

它首先在正常字母表中搜索字母h,然后在第7位找到它。所以现在它将用第7位修改后的字母表中的字母替换第一个字母。是i。但是现在你不打破内循环,它会在下一次迭代中搜索第一个字母,现在是正常字母表中的ii正好是内循环中的下一个字母。

所以你将每个字符替换为修改后的字母的末尾! (这在第一时间没有发生在你身上,因为你向后移动它所以它再也找不到了它)

答案 2 :(得分:0)

试试这个。您需要在匹配字母表时立即执行第二个循环。

<?php
$SentenceToEncode="hello stackoverflow, this is my first question. thanks for helping!";
$Alphabet="abcdefghijklmnopqrstuvwxyz";
//$ModifiedAlphabet="zabcdefghijklmnopqrstuvwxy";
$ModifiedAlphabet="bcdefghijklmnopqrstuvwxyza";
$SentenceLength=strlen($SentenceToEncode);

for($i=0;$i<$SentenceLength;$i++){
    for($j=0;$j<strlen($ModifiedAlphabet);$j++){   
        if($SentenceToEncode[$i]===$Alphabet[$j]){
            $SentenceToEncode[$i]=$ModifiedAlphabet[$j];
            break;
        }
    }
}
echo $SentenceToEncode;
?>