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 字符串操作入门教程
Dec 06 PHP
wamp下修改mysql访问密码的解决方法
May 07 PHP
那些年我们错过的魔术方法(Magic Methods)
Jan 14 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
Jun 30 PHP
PHP截取指定图片大小的方法
Dec 10 PHP
php下Memcached入门实例解析
Jan 05 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
Jun 13 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
Dec 21 PHP
php微信公众号开发之现金红包
Apr 16 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
Dec 20 PHP
laravel validate 设置为中文的例子(验证提示为中文)
Sep 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
用PHP实现图象锐化代码
2007/06/14 PHP
PHP 第二节 数据类型之数组
2012/04/28 PHP
与文件上传有关的php配置参数总结
2013/06/14 PHP
部署PHP时的4个配置修改说明
2015/10/19 PHP
mac系统下为 php 添加 pcntl 扩展
2016/08/28 PHP
php实现通过soap调用.Net的WebService asmx文件
2017/02/27 PHP
Javascript Select操作大集合
2009/05/26 Javascript
jquery实现图片渐变切换兼容ie6/Chrome/Firefox
2013/08/02 Javascript
对于this和$(this)的个人理解
2013/09/08 Javascript
基于JQuery的列表拖动排序实现代码
2013/10/01 Javascript
Node.js和PHP根据ip获取地理位置的方法
2014/03/14 Javascript
JavaScript表单通过正则表达式验证电话号码
2014/03/14 Javascript
JS替换字符串中字符即替换全部而不是第一个
2014/06/04 Javascript
JS中的hasOwnProperty()、propertyIsEnumerable()和isPrototypeOf()
2016/08/11 Javascript
jQuery UI制作选项卡(tabs)
2016/12/13 Javascript
js实现方块上下左右移动效果
2017/08/17 Javascript
Vue keep-alive实践总结(推荐)
2017/08/31 Javascript
解决Vue中mounted钩子函数获取节点高度出错问题
2018/05/18 Javascript
UEditor 自定义图片视频尺寸校验功能的实现代码
2020/10/20 Javascript
python求素数示例分享
2014/02/16 Python
python实现简单温度转换的方法
2015/03/13 Python
Python基于回溯法子集树模板实现8皇后问题
2017/09/01 Python
python删除列表元素的三种方法(remove,pop,del)
2019/07/22 Python
python 操作excel表格的方法
2020/12/05 Python
美国南部最大的家族百货公司:Belk
2017/01/30 全球购物
薇诺娜官方网上商城:专注敏感肌肤
2017/05/25 全球购物
房地产员工找工作的自我评价
2013/11/15 职场文书
音乐专业自荐信
2014/02/07 职场文书
党的群众路线教育实践活动心得体会
2014/03/03 职场文书
公务员更新知识培训实施方案
2014/03/31 职场文书
政风行风评议工作总结
2014/10/21 职场文书
2014年高三班主任工作总结
2014/12/05 职场文书
中学生社会实践教育活动总结
2015/05/06 职场文书
实施意见格式范本
2015/06/05 职场文书
招商银行工作证明
2015/06/17 职场文书
css3手动实现pc端横向滚动
2022/06/21 HTML / CSS