2011-03-25 5 views
2

私は単純だと思っていたが、かなり複雑になる問題がある。PHPとマルチバイト文字のヘルプ

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

は、私は2つのことを実行する必要があります。

  1. てください(新しい文字列は、dupesを剥奪して出力)重複文字がないことを確認します。
  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; 
} 

これら二つの機能を使用して、誰かが非常に不思議なことに、ユニークな文字列(重複していない)のように見えますが、シャッフルされた文字列には同じ文字数が含まれていません。 (私はブラウザからこれらの文字を強調表示し、別のアプリケーションに切り貼りしています...文字列は常に上記とは異なる長さですが、しばしば変化します...同じ文字数でもありません毎回切り捨てられます!)。

私は申し訳ありませんが、私はPHPについて十分に分かっていないし、自分自身を夢中にするためにコーディングしていますが、ここで間違っているのは何ですか?大きな長い弦をシャッフルするのは簡単にできるはずですが、明らかに思ったよりもはるかに困難です。これを行うもう1つの簡単な方法がありますか?文字列を最初にそれぞれの16進数に変換してそれらをシャッフルし、UTF-8に変換し直す必要がありますか?画面ではなくファイルに出力する必要がありますか?

誰もが何か提案がありますか?申し訳ありませんが、私はこれにはとても新しいので、おそらく私は何か本当にばかなことをしています。

+0

コードを整形するのは簡単です:すべての行の前に4つのスペースを使用し、コードとして認識されます。コードを再フォーマットしてください。 –

+0

私はすでにそれをしました... – apesa

+0

@apea:ありがとう!私は何とか最初の行に4つのスペースしか入れないと思っていました。 – Dave

答えて

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; 

} 
+0

Craig、これを提供してくれてありがとう...私は少し違うやり方をすることに決めました。これを編集して、&#ABCD内にある一意のパターンを取り除くことができます。フォーマット?いずれにせよ、提案に感謝します!私もこれを試して、指が交差しないようにしましょう! – Dave

+0

@Dave - 問題ではありません、それが助けてくれることを願っています。私は中国語を含む文字列でテストしましたが、完全に動作するように見えました。 (ブラウザで表示している場合は出力用にUTF-8ヘッダーが設定されていることを確認してください。それ以外の場合は正しく表示されません)。 '&#uABCD;フォーマットされた文字で作業しようとするのはお勧めできません。なぜなら、あなた自身でもっと複雑にしたいからです。しかし、正規表現を得ることができると確信しています。物事がうまくいくかどうか私に教えてください。 –

関連する問題