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 危险函数全解析
Sep 09 PHP
PHP+XML 制作简单的留言本 图文教程
Nov 02 PHP
排序算法之PHP版快速排序、冒泡排序
Apr 09 PHP
smarty内置函数{loteral}、{ldelim}和{rdelim}用法实例
Jan 22 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
Jul 07 PHP
PHP+Ajax验证码验证用户登录
Jul 20 PHP
PHP类和对象相关系统函数与运算符小结
Sep 28 PHP
thinkPHP批量删除的实现方法分析
Nov 09 PHP
PHP自定义序列化接口Serializable用法分析
Dec 29 PHP
浅谈PHP无限极分类原理
Mar 14 PHP
PHP上传图片到数据库并显示的实例代码
Dec 20 PHP
THINKPHP-Apache服务器中使用Alias虚拟目录URL重写 隐藏index.php
Mar 09 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.ini中date.timezone设置分析
2011/07/29 PHP
PHP进程同步代码实例
2015/02/12 PHP
学习php设计模式 php实现装饰器模式(decorator)
2015/12/07 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
php7连接MySQL实现简易查询程序的方法
2020/10/13 PHP
JS下高效拼装字符串的几种方法比较与测试代码
2010/04/15 Javascript
juqery 学习之三 选择器 可见性 元素属性
2010/11/25 Javascript
javascript中递归函数用法注意点
2015/07/30 Javascript
Jquery左右滑动插件之实现超级炫酷动画效果附源码下载
2015/12/02 Javascript
NodeJS配置HTTPS服务实例分享
2017/02/19 NodeJs
Node.js中看JavaScript的引用
2017/04/22 Javascript
Express框架之connect-flash详解
2017/05/31 Javascript
vue 实现 ios 原生picker 效果及实现思路解析
2017/12/06 Javascript
Vue实现滑动拼图验证码功能
2019/09/15 Javascript
利用JS代码自动删除稿件的普通弹幕功能
2019/09/20 Javascript
Javascript实现鼠标点击冒泡特效
2019/12/24 Javascript
js将URL网址转为16进制加密与解密函数
2020/03/04 Javascript
Vue项目打包编译优化方案
2020/09/16 Javascript
深入浅析python定时杀进程
2016/06/06 Python
Python的Flask框架中的Jinja2模板引擎学习教程
2016/06/30 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
2018/04/02 Python
python计算两个矩形框重合百分比的实例
2018/11/07 Python
pip install python 快速安装模块的教程图解
2019/10/08 Python
Python异常模块traceback用法实例分析
2019/10/22 Python
The Athlete’s Foot新西兰:新西兰最大的运动鞋零售商
2019/12/23 全球购物
毕业生文员求职信
2013/11/03 职场文书
职业生涯规划设计步骤
2014/01/12 职场文书
企业安全生产责任书
2014/04/14 职场文书
幼儿教师自我剖析材料
2014/09/29 职场文书
音乐课《小猫钓鱼》教学反思
2016/02/18 职场文书
《童年》读后感(三篇)
2019/08/27 职场文书
css 中多种边框的实现小窍门
2021/04/07 HTML / CSS
详解盒子端CSS动画性能提升
2021/05/24 HTML / CSS
python基于turtle绘制几何图形
2021/06/15 Python
JVM钩子函数的使用场景详解
2021/08/23 Java/Android
div与span之间的区别与使用介绍
2021/12/06 HTML / CSS