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 相关文章推荐
PHP+MYSQL的文章管理系统(二)
Oct 09 PHP
解析php中获取url与物理路径的总结
Jun 21 PHP
php number_format() 函数通过千位分组来格式化数字的实现代码
Aug 06 PHP
PHP中$_FILES的使用方法及注意事项说明
Feb 14 PHP
PHP 正则表达式常用函数
Aug 17 PHP
php自定文件保存session的方法
Dec 10 PHP
php遍历删除整个目录及文件的方法
Mar 13 PHP
PHP register_shutdown_function()函数的使用示例
Jun 23 PHP
PHP二维数组矩形转置实例
Jul 20 PHP
PHP和MYSQL实现分页导航思路详解
Apr 11 PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 PHP
如何通过Apache在本地配置多个虚拟主机
Jul 29 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
中国第一家无线电行
2021/03/01 无线电
很让人受教的 提高php代码质量36计
2012/09/05 PHP
PHP读取文件内容的五种方式
2015/12/28 PHP
javascript eval函数深入认识
2009/02/21 Javascript
jqPlot jquery的页面图表绘制工具
2009/07/25 Javascript
jquery 之 $().hover(func1, funct2)使用方法
2012/06/14 Javascript
常用一些Javascript判断函数
2012/08/14 Javascript
js 单击式的下拉菜单效果实例
2013/08/13 Javascript
node.js使用require()函数加载模块
2014/11/26 Javascript
jQuery插件pagewalkthrough实现引导页效果
2015/07/05 Javascript
jQuery中选择器的基础使用教程
2016/05/23 Javascript
Angular2 (RC4) 路由与导航详解
2016/09/21 Javascript
jQuery使用正则验证15/18身份证的方法示例
2017/04/27 jQuery
js图片上传的封装代码
2017/08/01 Javascript
JavaScript实现的DOM树遍历方法详解【二叉DOM树、多叉DOM树】
2018/05/07 Javascript
详解JavaScript 作用域
2020/07/14 Javascript
解决vue项目axios每次请求session不一致的问题
2020/10/24 Javascript
使用python实现baidu hi自动登录的代码
2013/02/10 Python
python分析nignx访问日志脚本分享
2015/02/26 Python
python安装Scrapy图文教程
2017/08/14 Python
python实现简单名片管理系统
2018/11/30 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
2019/04/15 Python
python基于Selenium的web自动化框架
2019/07/14 Python
python内存动态分配过程详解
2019/07/15 Python
Django windows使用Apache实现部署流程解析
2020/10/12 Python
天猫超市:阿里巴巴打造的网上超市
2016/11/02 全球购物
以设计师精品品质提供快速时尚:PopJulia
2018/01/09 全球购物
在线学习西班牙语、法语或其他语言:Babbel.com
2018/02/07 全球购物
世界上最大的冷却器制造商:Igloo Coolers
2019/07/23 全球购物
《最大的“书”》教学反思
2014/02/14 职场文书
交通事故协议书范文
2014/04/16 职场文书
教师节演讲稿
2014/05/06 职场文书
产品推广策划方案
2014/05/10 职场文书
2015年招聘工作总结
2014/12/12 职场文书
会议主持词结束语
2015/07/03 职场文书
redis哨兵常用命令和监控示例详解
2021/05/27 Redis