2017-10-11 7 views
-1

私は、文字列を与えられたオフセットに従ってエンコードされたものに変換するようにPHPで関数を記述しようとしています。例えばPHPのカスタムエンコーディング関数が必要な結果を提供していません

: オフセット2であり、入力がcであればオフセットは5であり、入力がXであれば、出力も同様e なり、出力がc

function encode($char,$offset) 
{ 
$char_list = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
$_offset = strpos($char_list,$char) + $offset; 

if($offset > strlen($char_list)){ 
    $_offset = _$offset - $offset; 
} 
return $char_list[$_offset]; 
} 

必要な結果である。

encode("a",0) // must returns a 
encode("c",5) // must returns h 
encode("X",9) // must returns g 
+1

あなたの質問は...? – Twinfriends

+0

@Twinfriends、アルゴリズムを修正してください –

+0

[PHP Caesar cipher](https://stackoverflow.com/questions/21177443/php-caesar-cipher)の重複の可能性あり – Profit

答えて

1

if内の新しいオフセットの計算ブロックが正しくない場合は、オフセットではなく文字列の長さを減算する必要があります。しかし、modulo operatorを使用する方が良いです:

function encode($char,$offset) { 
    $char_list = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    $_offset = strpos($char_list,$char) + $offset; 
    $_offset = $_offset % strlen($char_list); 
    return $char_list[$_offset]; 
} 
+0

あなたは素晴らしいです!ありがとうございました –

+0

ここで%記号が何をしているのか少し説明できますか? –

+1

[モジュロ演算子](http://php.net/manual/en/language.operators.arithmetic.php)です。したがって、左側の値が右側の値より大きい場合は常にそれが右の値よりも小さくなるまで正しい値を返します。それ以外の場合は、整数除算の後の余りです。 – trincot

関連する問題