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动态变静态原理
Nov 25 PHP
常用表单验证类,有了这个,一般的验证就都齐了。
Dec 06 PHP
PHP中PDO基础教程 入门级
Sep 04 PHP
那些年一起学习的PHP(三)
Mar 22 PHP
PHP代码审核的详细介绍
Jun 13 PHP
PHP获取当前所在目录位置的方法
Nov 26 PHP
php使用fputcsv()函数csv文件读写数据的方法
Jan 06 PHP
PHP登录验证码的实现与使用方法
Jul 07 PHP
PHP 验证身份证是否合法的函数
Feb 09 PHP
PHP使用标准库spl实现的观察者模式示例
Aug 04 PHP
Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法
Sep 30 PHP
PHP code 验证码生成类定义和简单使用示例
May 27 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中获取远程客户端的真实ip地址的方法
2011/08/03 PHP
使用新浪微博API的OAuth认证发布微博实例
2015/03/27 PHP
php猜单词游戏
2015/09/29 PHP
ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法
2016/11/12 PHP
PHP获取当前执行php文件名的代码
2017/03/02 PHP
Laravel5中Cookie的使用详解
2017/05/03 PHP
一个可以显示阴历的JS代码
2007/03/05 Javascript
jquery-easyui关闭tab自动切换到前一个tab
2010/07/29 Javascript
控制input输入框中提示信息的显示和隐藏的方法
2014/02/12 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
2015/07/17 Javascript
jQuery热气球动画半透明背景的后台登录界面代码分享
2015/08/28 Javascript
JQuery EasyUI的使用
2016/02/24 Javascript
判断JS对象是否拥有某属性的方法推荐
2016/05/12 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
2016/06/03 Javascript
JS正则替换去空格的方法
2017/03/24 Javascript
js时间戳与日期格式之间转换详解
2017/12/11 Javascript
解决angular双向绑定无效果,ng-model不能正常显示的问题
2018/10/02 Javascript
vue中v-for通过动态绑定class实现触发效果
2018/12/06 Javascript
微信小程序实现简单表格
2019/02/14 Javascript
微信小程序使用 vant Dialog组件的正确方式
2020/02/21 Javascript
js实现随机圆与矩形功能
2020/10/29 Javascript
python之yield表达式学习
2014/09/02 Python
Python连接MySQL并使用fetchall()方法过滤特殊字符
2016/03/13 Python
python、java等哪一门编程语言适合人工智能?
2017/11/13 Python
Python使用random模块生成随机数操作实例详解
2019/09/17 Python
Python socket模块方法实现详解
2019/11/05 Python
python使用协程实现并发操作的方法详解
2019/12/27 Python
如何理解python对象
2020/06/21 Python
如何解决安装python3.6.1失败
2020/07/01 Python
keras 简单 lstm实例(基于one-hot编码)
2020/07/02 Python
HTML5 微格式和相关的属性名称
2010/02/10 HTML / CSS
Perfumetrader荷兰:香水、化妆品和护肤品在线商店
2017/09/15 全球购物
小学生新学期寄语
2014/01/19 职场文书
乡领导班子四风问题对照检查材料
2014/09/25 职场文书
工程部经理岗位职责
2015/02/02 职场文书
庆七一晚会主持词
2015/06/30 职场文书