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 相关文章推荐
PHP4在WinXP下IIS和Apache2服务器上的安装实例
Oct 09 PHP
如何在PHP中使用Oracle数据库(5)
Oct 09 PHP
php 8小时时间差的解决方法小结
Dec 22 PHP
Php中用PDO查询Mysql来避免SQL注入风险的方法
Apr 25 PHP
php堆排序实现原理与应用方法
Jan 03 PHP
php查询whois信息的方法
Jun 08 PHP
php arsort 数组降序排序详细介绍
Nov 17 PHP
PHP自定义函数判断是否为Get、Post及Ajax提交的方法
Jul 27 PHP
laravel5.4生成验证码的实例讲解
Aug 05 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
Jun 13 PHP
laravel实现简单用户权限的示例代码
May 28 PHP
PHP实现微信提现功能(微信商城)
Nov 21 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
ADODB结合SMARTY使用~超级强
2006/11/25 PHP
探讨php中防止SQL注入最好的方法是什么
2013/06/10 PHP
PHP从FLV文件获取视频预览图的方法
2015/03/12 PHP
PHP的swoole扩展安装方法详细教程
2016/05/18 PHP
JQuery-tableDnD 拖拽的基本使用介绍
2013/07/04 Javascript
JavaScript声明变量时为什么要加var关键字
2014/09/29 Javascript
20条学习javascript的编程规范的建议
2014/11/28 Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
2015/07/28 Javascript
Sea.JS知识总结
2016/05/05 Javascript
JS动态的把左边列表添加到右边的实现代码(可上下移动)
2016/11/17 Javascript
jQuey将序列化对象在前台显示地实现代码(方法总结)
2016/12/13 Javascript
详谈js遍历集合(Array,Map,Set)
2017/04/06 Javascript
简单了解Ajax表单序列化的实现方法
2019/06/14 Javascript
js实现简易计算器功能
2019/10/18 Javascript
在vue中使用vuex,修改state的值示例
2019/11/08 Javascript
Vue学习之axios的使用方法实例分析
2020/01/06 Javascript
python3实现爬取淘宝美食代码分享
2018/09/23 Python
python中struct模块之字节型数据的处理方法
2019/08/27 Python
Python 字符串处理特殊空格\xc2\xa0\t\n Non-breaking space
2020/02/23 Python
python删除某个目录文件夹的方法
2020/05/26 Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
2020/06/18 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
2020/10/26 Python
Nike英国官网:Nike.com (UK)
2017/02/13 全球购物
佳能加拿大网上商店:Canon eStore Canada
2018/04/04 全球购物
如何使用PHP session
2015/04/21 面试题
工商学院毕业生个人自我评价
2013/09/19 职场文书
司机辞职报告范文
2014/01/20 职场文书
留学推荐信怎么写
2014/01/25 职场文书
节能环保标语
2014/06/12 职场文书
教代会闭幕词
2015/01/28 职场文书
2015入党自荐书范文
2015/03/05 职场文书
2015中秋节慰问信范文
2015/03/23 职场文书
学校捐款活动总结
2015/05/09 职场文书
入学证明
2015/06/23 职场文书
社区挂职锻炼个人工作总结
2015/10/23 职场文书
html5移动端禁止长按图片保存的实现
2021/04/20 HTML / CSS