圧縮された文字列を解凍し、順次出力します.


圧縮された文字列を解凍し、順次出力します.
アルゴリズムの説明:
解凍ルール:
各文字列の後ろには、この文字が繰り返される回数を示す数字が付いています.
例えば、「a 5」は解凍後「aaaa」、「abc 3」は解凍後「abcabcbac」
ソート・ルール:
文字列の繰り返し回数に基づいて昇順にソートします.例えば、「a 3 b 2」は解凍後「bbaaa」2となる.
文字列の繰り返し回数が同じ場合は、ASCIIに従って昇順に並べ替えます.例えば、「b 2 a 2」は解凍後「aabb」となる.
実現構想:
私はこの問題を見て、まず考えたのは数字と英語を分けて、説明の中に順序の規則があるので、鍵の値の関係に組み立てることができるほうがいいです.アルゴリズムの説明の中で、数字が同じであることを明確に言ったので、数字は最も鍵にすることができなくて、それは類似するしかありません:['a'=>2](英語を話さないと同じになりますが、私たちはしばらく繰り返していないと決めました.以下のコードは繰り返して書いていません).
コード実装:
function str_unpack($str){
    $str_arr = preg_split("/([0-9]+)/", $str, -1, PREG_SPLIT_NO_EMPTY);
    $num_arr = preg_split("/([a-zA-Z]+)/", $str, -1, PREG_SPLIT_NO_EMPTY);
    $new_arr = array_combine($str_arr,$num_arr);
    ksort($new_arr);
    asort($new_arr);
    $str = '';
    foreach ($new_arr as $k =>$v) {
        $str.=str_repeat($k,$v);
    }
    return $str;
}

コードの実行:
$input = 'a11b2bac3bad3abcd2cc4aa4';
echo str_unpack($input);

実行結果:
abcdabcdbbbacbacbacbadbadbadaaaaaaaaccccccccaaaaaaaaaaa
最後にまとめます.
コードにはPHP内蔵関数preg_が用いられているsplit()は、正規を使用して文字列を分割します.今のところもっと良い方法は考えられず、この文章を見た大物がもっと良い方法を与えてほしいと思っています.ソートは、キーでソートされたksort()と値でソートされたasort()である.具体的に分からない場合はPHP公式マニュアルにアクセスできます.
また、これは、重複する英語を考慮していないことを前提としており、キー値関係を構成することはできません.次のようなスタイルを構成することができます.
$arr = [
    '0'=>['11'=>'a'],
    '1'=>['2'=>'b'],
    '2'=>['3'=>'bac'],
];

これでもいいです.興味のある学生はやってみてください.
www.caohongyuan.cn
指導を歓迎します!
千而的大狮子