0

私はこのコードを使用して単純な暗号化を行っています:

    function idEncrypt($string)
{
    $multiply = 2457;
    $original = array('1', '2','3', '4', '5', '6', '7', '8', '9', '0');
    $replace = array('6', '3', '9', '1', '2', '8', '5', '0', '4', '7');
    $idEncrypt = str_replace($original, $replace, $string);
    //$idEncrypt = $idEncrypt * $multiply;
    return $idEncrypt;      
}

数値を取得し、$replace配列の正しい数値に置き換えることになっています。「234」を入力しているのですが、答えは「441」で、「391」になるはずです。
助言がありますか ?

4

3 に答える 3

2

問題はstr_replace、配列内の各要素に何度も適用されていることです。

'234'の場合、最初の2は3に置き換えられ、次に3は9に置き換えられ、次に9は4に置き換えられます。

3は9に置き換えられ、次に9は4に置き換えられます。

最後に、4が1に置き換えられ、「441」が作成されます。

于 2012-04-30T16:32:39.543 に答える
1

strtr代わりに使用してみてください。次のようにコードを変更する必要があります。

$original = "1234567890";
$replace = "6391285047";

そして、それはの落とし穴を回避しstr_replaceます。

于 2012-04-30T16:35:29.833 に答える
1

重要なビットは、str_replace関数のドキュメントにあります。

交換注文の落とし穴

str_replace()は左から右に置換されるため、複数の置換を行う場合、以前に挿入された値を置換する可能性があります。このドキュメントの例も参照してください。

単純な「暗号化」には、PHPのstrtr関数を使用します。

function transform($string) {
  $original = '1234567890';
  $replace = '6391285047';
  return str_replace($string, $original, $replace);
}

nb。独自の「暗号化」関数を作成しないでください。確立され、十分にテストされたアルゴリズムとライブラリを使用します。

于 2012-04-30T16:33:11.393 に答える