PHP内部实现打乱字符串顺序函数str_shuffle的方法


Posted in PHP onFebruary 14, 2019

前言

2019年春节已过,今天是上班第一天,还得翻一翻之前没有看完的PHP源码。

今天聊的是字符串顺序打乱函数str_shuffle。这个函数本身使用频率并不高。但是,其内部实现还是非常有趣的。

str_shuffle() 函数随机地打乱字符串中的所有字符。

要注意,打乱的是字符串中的“字符”

  • 一个字母等于一个字符
  • 一个汉字等于2个字符

自己实现

如果在没有看PHP源码内部实现之前,如果使用php实现内部字符串打乱顺序的操作,我能想到的是下面几种方式。

循环随机数

使用随机数,可以有随机取字符串的字符拼接,或者顺序取出,放到随机数自定的位置。这两种方式都涉及到随机数重复的情况,需要去重。

PHP内部实现打乱字符串顺序函数str_shuffle的方法

这种方式的重点在于生成不重复的随机数。

切分成数组然后打乱顺序

PHP内部实现打乱字符串顺序函数str_shuffle的方法

用数组打乱顺序的方式实现其实是有些“作弊”嫌疑。

PHP内部实现

来看看PHP内部如何实现。

PHP内部实现打乱字符串顺序函数str_shuffle的方法

其实PHP内部也是使用随机数实现,但是他的巧妙之处在于使用随机数抽取字符串与一个特定的字符串(最后一个)进行替换。这样就不用去考虑随机数重复的问题。不会因为重复到账一些字符串被覆盖。

文章开始的随机数抽取,不能保证经过n次后结束,因为需要跳过随机数重复的情况。但是php内部的实现,都是n次循环后结束。在性能上肯定比需要去重的随机数方法要好。

两个方法的出发点都一样,但是稍微的不一样就可以带来很大的提升。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
在Windows版的PHP中使用ADO
Oct 09 PHP
完美解决dedecms中的[html][/html]和[code][/code]问题
Mar 20 PHP
PHP 用数组降低程序的时间复杂度
Dec 04 PHP
Warning: session_destroy() : Trying to destroy uninitialized sessionq错误
Jun 16 PHP
phpmail类发送邮件函数代码
Feb 20 PHP
PHP浮点数精度问题汇总
May 13 PHP
php使用函数pathinfo()、parse_url()和basename()解析URL
Nov 25 PHP
redirect_uri参数错误的解决方法(必看)
Feb 16 PHP
PHP与以太坊交互详解
Aug 24 PHP
PHP调用全国天气预报数据接口查询天气示例
Feb 20 PHP
Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作示例
Oct 11 PHP
Cookie跨域问题解决方案代码示例
Nov 24 PHP
PHP安装memcache扩展的步骤讲解
Feb 14 #PHP
PHP配置ZendOpcache插件加速
Feb 14 #PHP
PHP convert_uudecode()函数讲解
Feb 14 #PHP
PHP安装BCMath扩展的方法
Feb 13 #PHP
php面试中关于面向对象的相关问题
Feb 13 #PHP
PHP中检查isset()和!empty()函数的必要性
Feb 13 #PHP
PHP实现PDO操作mysql存储过程示例
Feb 13 #PHP
You might like
用PHP进行MySQL删除记录操作代码
2008/06/07 PHP
用PHP的ob_start() 控制您的浏览器cache
2009/08/03 PHP
Discuz 6.0+ 批量注册用户名
2009/09/13 PHP
PHP中删除变量时unset()和null的区别分析
2011/01/27 PHP
js和php邮箱地址验证的实现方法
2014/01/09 PHP
PHP版本常用的排序算法汇总
2015/12/20 PHP
PHP基于递归实现的约瑟夫环算法示例
2017/08/27 PHP
在laravel框架中使用model层的方法
2019/10/08 PHP
Js 随机数产生6位数字
2010/05/13 Javascript
理解Javascript_13_执行模型详解
2010/10/20 Javascript
仿jQuery的siblings效果的js代码
2011/08/09 Javascript
js中的scroll和offset 使用比较的实例与分析
2013/09/29 Javascript
3种不同方式的焦点图轮播特效分享
2013/10/30 Javascript
JS实现购物车特效
2017/02/02 Javascript
微信小程序组件 marquee实例详解
2017/06/23 Javascript
JS实现页面内跳转的简单代码
2017/09/03 Javascript
jquery一键控制checkbox全选、反选或全不选
2017/10/16 jQuery
vue生成token保存在客户端localStorage中的方法
2017/10/25 Javascript
[50:27]Secret vs VG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python内置函数之filter map reduce介绍
2014/11/30 Python
Python中for循环和while循环的基本使用方法
2015/08/21 Python
Python 查看文件的读写权限方法
2018/01/23 Python
pytorch加载自定义网络权重的实现
2020/01/07 Python
HTML5组件Canvas实现图像灰度化(步骤+实例效果)
2013/04/22 HTML / CSS
四方通行旅游网:台湾订房、出国旅游
2017/09/20 全球购物
Clearly新西兰:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
财务负责人任命书
2014/06/06 职场文书
学校感恩教育活动总结
2014/07/07 职场文书
2014国庆节标语口号
2014/09/19 职场文书
销售员态度差检讨书
2014/10/26 职场文书
2014城乡环境综合治理工作总结
2014/12/19 职场文书
少先队大队委竞选口号
2015/12/25 职场文书
2016校本研修培训心得体会
2016/01/08 职场文书
《浅水洼里的小鱼》教学反思
2016/02/16 职场文书
Python 如何安装Selenium
2021/05/06 Python
python使用pywinauto驱动微信客户端实现公众号爬虫
2021/05/19 Python