Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno PHP - zámena řetězců

Dobrý den, napsal jsem si skript v PHP ale nejede...

$zadani = $_GET['zadani'];
$pocet = strlen($zadani);
$pismena = "abcdefghijklm";
$dekod = array("a","b","c","d","e","f","g","h","i","j","k","l","m");
$enkod = array("n","o","p","q","r","s","t","u","v","w","x","y","z");
for ($i=0;$i<$pocet;$i++){
if(strpbrk($zadani[$i],$pismena)){
$zadani[$i] = str_replace($enkod,$dekod,$zadani[$i]);
echo $i;
}
else{
$zadani[$i] = str_replace($dekod,$enkod,$zadani[$i]);
}
echo $zadani;

Pak jsem si pracně! Napsal druhý mnohem kratší ale na hodně manuální práce který úž funguje, nešlo by to ale zapsat jinak jednodušeji nebo lépe? Mělo by to obracet písměna ve tvaru a>n nebo n>a atd... obyčejný str_replace udělal toto.. a>n>a což jsem vlastně tam kde jsem byl, Díky za rady.
Druhý:

<?
$zadani = $_GET['zadani'];
$pocet = strlen($zadani);
$dekoder = array("a" => "n", atd..... desítky obratů, "z" => "m");
$zadani = strtr($zadani,$dekoder);
echo "$zadani";
?>
Předmět Autor Datum
Děláš Caesarovu šifru? :-). Jednoduché řešení: <?php $key = array('a' => 'f','b' => 'g','c' => 'h',…
marekdrtic 04.04.2010 14:11
marekdrtic
TO pole je zbytečné generovat - pokud a->f pak stačí přičíst k ascii (a) hodnotu 5. a vsem kteri jso…
AZOR 04.04.2010 14:40
AZOR
Pravdu díš, mrknul jsem se na funkci ord a ono to půjde i takto: function caesar_cipher($text,$posu…
marekdrtic 04.04.2010 14:44
marekdrtic
:-p strtolower se da napsat do toho foru (i kdyz to zpomali a mozna to pujde napsat i s tim forem na…
AZOR 04.04.2010 15:16
AZOR
Díky hoši :-D
pcsmudla 04.04.2010 18:06
pcsmudla
Označil jsem tedy vyřešeno. poslední
marekdrtic 04.04.2010 18:13
marekdrtic

Děláš Caesarovu šifru? :-).
Jednoduché řešení:

<?php
$key = array('a' => 'f','b' => 'g','c' => 'h','d' => 'i','e' => 'j','f' => 'k','g' => 'l','h' => 'm','i' => 'n','j' => 'o','k' => 'p','l' => 'q','m' => 'r','n' => 's','o' => 't','p' => 'u','q' => 'v','r' => 'w','s' => 'x','t' => 'y','u' => 'z','v' => 'a','w' => 'b','x' => 'c','y' => 'd','z' => 'e', '_' => '_');

$zadani = 'nejaky_nesmyslny_text';//$_GET['zadani'];
$delka = strlen($zadani);
$zadani_new = '';

 for($i=0;$i<$delka;$i++)
 {
   $zadani_new .= $key[$zadani[$i]];
 }

echo $zadani_new;
?>

To pole snad není problém nechat si ho vydegenerovat automaticky:

<?php
echo '$key = array(';
$posunuti = 5; // tohle si upravis, jak budes chtit
for($i=97; $i<=122;$i++)
{
echo "'".chr($i)."' => '";
if($i+$posunuti > 122)  echo chr(($i+$posunuti)-122+96); else  echo chr($i+$posunuti); 
echo "'";
if($i != 122) echo ",";
}
echo ");"
?>

Výstup:

$key = array('a' = > 'f','b' = > 'g','c' = > 'h','d' = > 'i','e' = > 'j','f' = > 'k','g' = > 'l','h' = > 'm','i' = > 'n','j' = > 'o','k' = > 'p','l' = > 'q','m' = > 'r','n' = > 's','o' = > 't','p' = > 'u','q' = > 'v','r' = > 'w','s' = > 'x','t' = > 'y','u' = > 'z','v' = > 'a','w' = > 'b','x' = > 'c','y' = > 'd','z' = > 'e');

Bonus (ber to jako dárek k Velikonocím ;-)). Funkce, která ti to udělá sama:

function caesar_cipher($text,$posunuti)
{
$text_new = '';
$key = array();
 for($i=97; $i<=122;$i++)
 {
  $key[chr($i)] = ($i+$posunuti > 122) ? chr(($i+$posunuti)-122+96) : chr($i+$posunuti);
 }

$key[' '] = '_';
$text = strtolower($text);

 for($i=0;$i<strlen($text);$i++)
 {
  $text_new .= $key[$text[$i]];
 }
return $text_new;
}


echo caesar_cipher('Nejaky text o nicem',15); //vrati "ctypzn_itmi_d_cxrtb"

Je to napsaný trochu prasácky (PHPčka jsem se nedotknul pár měsíců), ale hlavně, že to funguje :-).

Pravdu díš, mrknul jsem se na funkci ord a ono to půjde i takto:

function caesar_cipher($text,$posunuti)
{
$text_new = '';
$text = strtolower($text);

for($i=0;$i<strlen($text);$i++)
{
$text_new .= (ord($text[$i])+$posunuti > 122) ? chr(ord($text[$i])+$posunuti-122+96) : chr(ord($text[$i])+$posunuti);
}

return $text_new;
}

Určitě to půjde ještě zjednodušit :-).

Zpět do poradny Odpovědět na původní otázku Nahoru