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程序
Oct 09 PHP
一个没有MYSQL数据库支持的简易留言本的编写
Oct 09 PHP
PHP分页显示制作详细讲解
Dec 05 PHP
Joomla下利用configuration.php存储简单数据
May 19 PHP
php 面向对象的一个例子
Apr 12 PHP
在Yii框架中使用PHP模板引擎Twig的例子
Jun 13 PHP
php ci 获取表单中多个同名input元素值的代码
Mar 25 PHP
360搜索引擎自动收录php改写方案
Apr 28 PHP
php 可变函数使用小结
Jun 12 PHP
PHP生成zip压缩包的常用方法示例
Aug 22 PHP
CI框架简单分页类用法示例
Jun 06 PHP
常见的5个PHP编码小陋习以及优化实例讲解
Feb 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应用JSON技巧讲解
2013/02/03 PHP
PHP下使用CURL方式POST数据至API接口的代码
2013/02/14 PHP
ThinkPHP文件上传实例教程
2014/08/22 PHP
Yii实现显示静态页的方法
2016/04/25 PHP
Yii中的cookie的发送和读取
2016/07/27 PHP
PHP面向对象自动加载机制原理与用法分析
2016/10/14 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
php中yar框架实例用法讲解
2020/12/27 PHP
IE图片缓存document.execCommand("BackgroundImageCache",false,true)
2011/03/01 Javascript
jQuery+css实现图片滚动效果(附源码)
2013/03/18 Javascript
jquery序列化form表单使用ajax提交后处理返回的json数据
2014/03/03 Javascript
js 实现浏览历史记录示例
2014/04/20 Javascript
JavaScript中数组继承的简单示例
2015/07/29 Javascript
基于Jquery实现仿百度百科右侧导航代码附源码下载
2015/11/27 Javascript
关于Bootstrap弹出框无法调用问题的解决办法
2016/03/10 Javascript
js 连续赋值的简单实现
2016/06/13 Javascript
JS实现根据用户输入分钟进行倒计时功能
2016/11/14 Javascript
利用vue实现模态框组件
2016/12/19 Javascript
vue router下的html5 history在iis服务器上的设置方法
2017/10/18 Javascript
Vue程序调试的方法
2019/06/17 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
Queue 实现生产者消费者模型(实例讲解)
2017/11/13 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
2018/07/02 Python
Django组件之cookie与session的使用方法
2019/01/10 Python
说说如何遍历Python列表的方法示例
2019/02/11 Python
python实现手机销售管理系统
2019/03/19 Python
html5 input元素新特性_动力节点Java学院整理
2017/07/06 HTML / CSS
自我鉴定书面格式
2014/01/13 职场文书
房地产营销策划方案
2014/02/08 职场文书
社区志愿者活动总结
2014/06/26 职场文书
社区元宵节活动总结
2015/02/06 职场文书
实践论读书笔记
2015/06/29 职场文书
优质服务标语口号
2015/12/26 职场文书
2016年社区服务活动总结
2016/04/06 职场文书
Pycharm远程调试和MySQL数据库授权问题
2022/03/18 MySQL
Nginx静态压缩和代码压缩提高访问速度详解
2022/05/30 Servers