php真正的多字节字符串shuffle函数?

时间:2011-03-23 20:14:07

标签: php multibyte chars

我有一个多字节字符串的独特问题,并且需要能够以一定程度的随机性,在PHP中使用长UTF-8编码的多字节字符串进行随机播放,而不会丢失或丢失或重复任何字符。

在str_shuffle下的PHP手册中,有一个不起作用的多字节函数(第一个用户提交了一个):如果我使用一个字符串,例如所有日语平假名和片长的片假名(ex)120 chars,我返回了一个字符串,其中包含119个字符或118个字符。有时我看到重复的字符,即使原始字符串没有它们。所以这不起作用。

为了使这更复杂,我还需要包括可能的日语UTF-8换行符和换行符以及标点符号。

有经验使用UTF-8 mb字符串处理多种语言的人有帮助吗? PHP有任何内置函数来执行此操作吗? str_shuffle完全是我想要的。我只需要它也可以处理多字节字符。

非常感谢!

3 个答案:

答案 0 :(得分:3)

尝试使用mb_strlenmb_substr分割字符串以创建数组,然后再使用shuffle将其重新连接在一起。 (编辑:正如@Frosty Z的回答所示。)

PHP交互式提示示例:

php > $string = "Pretend I'm multibyte!";
php > $len = mb_strlen($string);
php > $sploded = array(); 
php > while($len-- > 0) { $sploded[] = mb_substr($string, $len, 1); }
php > shuffle($sploded);
php > echo join('', $sploded);
rmedt tmu nIb'lyi!eteP

您需要确保在适当的时候指定编码。

答案 1 :(得分:0)

这也应该可以解决问题。我希望。

array.sort([compareFunction])

答案 2 :(得分:0)

我喜欢使用这个功能:

function mb_str_shuffle($multibyte_string = "abcčćdđefghijklmnopqrsštuvwxyzžß,.-+'*?=)(/&%$#!~ˇ^˘°˛`˙´˝") {
    $characters_array = mb_str_split($multibyte_string);
    shuffle($characters_array);
    return implode('', $characters_array); // or join('', $characters_array); if you have a death wish (JK)
}
  1. 将字符串拆分为多字节字符数组
  2. 打乱不关心他的居民是多字节的好人数组
  3. 将打乱的数组连接成一个字符串

当然,我通常不会有函数参数的默认值。