2017-10-11 16 views
-1

J'essaye d'écrire une fonction en PHP de telle manière qu'elle convertisse une chaîne en encodée en fonction du décalage donné.La fonction d'encodage personnalisée de PHP ne donne pas le résultat requis

Par exemple: si le décalage est 2 et l'entrée est c alors la sortie sera e De même, si le décalage est 5 et l'entrée est X alors la sortie est 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]; 
} 

résultats requis:

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

Et votre question est ...? – Twinfriends

+0

@Twinfriends, corrige l'algorithme –

+0

Copie possible de [PHP Caesar cipher] (https://stackoverflow.com/questions/21177443/php-caesar-cipher) – Profit

Répondre

1

Le calcul du nouveau décalage à l'intérieur du if bloc est incorrect, vous devez soustraire la longueur de la chaîne, pas le décalage. Mais il est préférable d'utiliser le 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

vous êtes juste incroyable! Merci beaucoup –

+0

Pouvez-vous expliquer un peu ce que le signe% fait ici? –

+1

C'est l'opérateur [modulo] (http://php.net/manual/fr/language.operators.arithmetic.php), donc quand la valeur à gauche est supérieure à la valeur à droite, elle est réduite de la bonne valeur jusqu'à ce qu'elle soit plus petite que la valeur à droite. Autrement dit, c'est le reste après une division entière. – trincot