2

簡単だと思っていた問題が、かなり複雑になってきました。

ローマ字、西ヨーロッパ、日本語、および韓国語の文字と句読点が混在する長い UTF-8 文字列があります。多くはマルチバイト文字ですが、そうでないものもあります (私はそう思います)。

私は2つのことをする必要があります:

  1. 重複した文字がないことを確認してください (そして、その新しい文字列を出力し、重複を取り除いてください)。
  2. その新しい文字列をランダムにシャッフルします。

(申し訳ありませんが、コードの引用を正しくフォーマットすることができないようです...)

function uniquechars($string) {
    $l = mb_strlen($string);
    $unique = array();
    for($i = 0; $i < $l; $i++) {
        $char = mb_substr($string, $i, 1);
        if(!array_key_exists($char, $unique))
            $unique[$char] = 0;
        $unique[$char]++;
    }
    $uniquekeys = join('', array_keys($unique));
    return $uniquekeys;
}  

と:

function unicode_shuffle($string)
{
    $len = mb_strlen($string);
    $sploded = array(); 
    while($len-- > 0) { 
        $sploded[] = mb_substr($string, $len, 1);
    }
    shuffle($sploded);
    $shuffled = join('', $sploded);
    return $shuffled;
}

誰かが非常に親切に提供してくれたこれらの2つの関数を使用して、私はすべて設定されていると思いました...不思議なことに、一意の文字列(重複なし)とシャッフルされた文字列には同じ数の文字が含まれていないようです. (私はブラウザからこれらの文字を強調表示し、別のアプリケーションにカットアンドペーストしています... 1つの文字列は常に上記のものとは異なる長さですが、多くの場合それは異なります...同じ数の文字が得られるわけではありません毎回切り捨てられます!)。

申し訳ありませんが、私は PHP についても、これを自分で調べるためのコーディングについても十分に知りませんが、一体何が問題になっているのでしょうか? 大きくて長い糸をシャッフルするだけなら簡単そうに見えますが、思ったより難しいようです。これを行う別の簡単な方法はありますか?最初に文字列をそれぞれの 16 進数に変換し、それらをシャッフルしてから、UTF-8 に戻す必要がありますか? 画面ではなくファイルに出力する必要がありますか?

誰か提案がありますか?申し訳ありませんが、私はこれに非常に慣れていないので、おそらく私は本当に愚かなことをしているだけです.

4

1 に答える 1

2

あなたはおそらくもっと簡単に物事を行うことができます。

文字列内の一意の文字のみを取得する関数は次のとおりです。

// returns an array of unique characters from a given string
function getUnique( $string ) {

    $chars = preg_split( '//', $string, -1, PREG_SPLIT_NO_EMPTY );
    $unique = array_unique( $chars );

    return $unique;

}

次に、順序を再シャッフルする場合は、一意の文字の配列を次のように渡しshuffleます。

$shuffled = shuffle( $unique );

編集:マルチバイト文字の場合、この関数はトリックを実行する必要があります (正規表現を支援してくれたhttp://php.net/manual/en/function.mb-split.phpに感謝します):

function getUnique( $string ) {

    $chars = preg_split( '/(?<!^)(?!$)/u', $string ); 
    $unique = array_unique( $chars );

    return $unique;

}
于 2011-03-26T22:50:52.990 に答える