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 相关文章推荐
example2.php
Oct 09 PHP
综合图片计数器
Oct 09 PHP
PHP中的日期及时间
Nov 23 PHP
PHP5 面向对象(学习记录)
Dec 02 PHP
php 获取百度的热词数据的代码
Feb 18 PHP
探讨:使用XMLSerialize 序列化与反序列化
Jun 08 PHP
destoon常用的安全设置概述
Jun 21 PHP
ThinkPHP入口文件设置及相关注意事项分析
Dec 05 PHP
php连接mysql数据库
Mar 21 PHP
Yii2.0实现生成二维码功能实例
Oct 24 PHP
PHP中关于php.ini参数优化详解
Feb 28 PHP
php优化查询foreach代码实例讲解
Mar 24 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
上海无线电三厂简史修改版
2021/03/01 无线电
PHP中对用户身份认证实现两种方法
2011/06/04 PHP
PHP可逆加密/解密函数分享
2012/09/25 PHP
php定时计划任务的实现方法详解
2013/06/06 PHP
JS实现图片横向滚动效果示例代码
2013/09/04 Javascript
js模仿hover的具体实现代码
2013/12/30 Javascript
JavaScript中提前声明变量或函数例子
2014/11/12 Javascript
jQuery实现瀑布流布局
2014/12/12 Javascript
Javascript节点关系实例分析
2015/05/15 Javascript
探析浏览器执行JavaScript脚本加载与代码执行顺序
2016/01/12 Javascript
jQuery+canvas实现简单的球体斜抛及颜色动态变换效果
2016/01/28 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
2016/01/28 Javascript
Vue.js每天必学之计算属性computed与$watch
2016/09/05 Javascript
AngularJs ng-route路由详解及实例代码
2016/09/14 Javascript
Javascript 事件冒泡机制详细介绍
2016/10/10 Javascript
详解基于Angular4+ server render(服务端渲染)开发教程
2017/08/28 Javascript
JavaScript时间戳与时间日期间相互转换
2017/12/11 Javascript
js时间戳与日期格式之间转换详解
2017/12/11 Javascript
webpack下实现动态引入文件方法
2018/02/22 Javascript
浅谈Node新版本13.2.0正式支持ES Modules特性
2019/11/25 Javascript
jquery将信息遍历到界面上实例代码
2020/01/21 jQuery
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
[01:18:43]2014 DOTA2华西杯精英邀请赛5 24 iG VS DK
2014/05/25 DOTA
python和shell变量互相传递的几种方法
2013/11/20 Python
详解Python在七牛云平台的应用(一)
2017/12/05 Python
Python之用户输入的实例
2018/06/22 Python
python函数与方法的区别总结
2019/06/23 Python
Python中使用__new__实现单例模式并解析
2019/06/25 Python
Python列表切片常用操作实例解析
2020/03/10 Python
keras .h5转移动端的.tflite文件实现方式
2020/05/25 Python
机械设计制造专业个人求职信
2013/09/25 职场文书
运动会入场词100字
2014/02/06 职场文书
公司晚会策划方案
2014/05/17 职场文书
优秀家长事迹材料
2014/05/17 职场文书
《地震中的父与子》教学反思
2016/02/16 职场文书
python自动计算图像数据集的RGB均值
2021/06/18 Python