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 得到根目录的 __FILE__ 常量
Jul 23 PHP
PHP无刷新上传文件实现代码
Sep 19 PHP
使用php判断服务器是否支持Gzip压缩功能
Sep 24 PHP
php对数组排序代码分享
Feb 24 PHP
php实现zip压缩文件解压缩代码分享(简单易懂)
May 10 PHP
PHP实现扎金花游戏之大小比赛的方法
Mar 10 PHP
php中smarty模板条件判断用法实例
Jun 11 PHP
PHP基于接口技术实现简单的多态应用完整实例
Apr 26 PHP
PHP实现mysqli批量执行多条语句的方法示例
Jul 22 PHP
详解cookie验证的php应用的一种SSO解决办法
Oct 20 PHP
Yii支持多域名cors原理的实现
Dec 05 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
Feb 22 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 htmlspecialchars()与shtmlspecialchars()函数的深入分析
2013/06/05 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
PHP示例演示发送邮件给某个邮箱
2019/04/03 PHP
php使用json-schema模块实现json校验示例
2019/09/28 PHP
又一个图片自动缩小的JS代码
2007/03/10 Javascript
学习ExtJS table布局
2009/10/08 Javascript
jQuery输入城市查看地图使用介绍
2013/05/08 Javascript
jquery 层次选择器siblings与nextAll的区别介绍
2013/08/02 Javascript
基于jQuery实现仿QQ空间送礼物功能代码
2016/05/24 Javascript
js判断checkbox是否选中个数的方法(超简单)
2016/08/19 Javascript
基于JavaScript实现鼠标向下滑动加载div的代码
2016/08/31 Javascript
微信小程序 template模板详解及实例代码
2017/03/09 Javascript
利用Javascript开发一个二维周视图日历
2017/12/14 Javascript
微信小程序搭建自己的Https服务器
2019/05/02 Javascript
Vue封装的组件全局注册并引用
2019/07/24 Javascript
JS原型和原型链原理与用法实例详解
2020/02/05 Javascript
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
2020/05/29 jQuery
[02:54]DOTA2英雄基础教程 撼地者
2014/01/14 DOTA
[41:08]2014 DOTA2国际邀请赛中国区预选赛 HGT VS NE
2014/05/22 DOTA
Python和GO语言实现的消息摘要算法示例
2015/03/10 Python
Django基于ORM操作数据库的方法详解
2018/03/27 Python
Python3.遍历某文件夹提取特定文件名的实例
2018/04/26 Python
python 切换root 执行命令的方法
2019/01/19 Python
python opencv判断图像是否为空的实例
2019/01/26 Python
Python安装及Pycharm安装使用教程图解
2019/09/20 Python
Python通过kerberos安全认证操作kafka方式
2020/06/06 Python
浅析Python requests 模块
2020/10/09 Python
HTML5之HTML元素扩展(上)—新增加的元素及使用概述
2013/01/31 HTML / CSS
英国最大的在线蜡烛商店:Candles Direct
2019/03/26 全球购物
工程项目经理岗位职责
2013/12/15 职场文书
车祸赔偿收入证明
2014/01/09 职场文书
大学生自我评价200字(4篇)
2014/09/17 职场文书
2014年学校安全工作总结
2014/11/13 职场文书
刮痧观后感
2015/06/05 职场文书
2015年六年级班主任工作总结
2015/10/15 职场文书
为什么中国式养孩子很累?
2019/08/07 职场文书