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
PHP的ASP防火墙
Oct 09 PHP
php+jquery+html实现点击不刷新加载更多的实例代码
Aug 12 PHP
AES加解密在php接口请求过程中的应用示例
Oct 26 PHP
thinkPHP模板中for循环与switch语句用法示例
Nov 30 PHP
PHP实现基于栈的后缀表达式求值功能
Nov 10 PHP
PHP array_reduce()函数的应用解析
Oct 28 PHP
PHP常见的几种攻击方式实例小结
Apr 29 PHP
Laravel框架查询构造器简单示例
May 08 PHP
php数组和链表的区别总结
Sep 20 PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
Oct 08 PHP
php设计模式之建造器模式分析【星际争霸游戏案例】
Jan 23 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/02 无线电
一个php作的文本留言本的例子(三)
2006/10/09 PHP
php中使用gd库实现远程图片下载实例
2015/05/12 PHP
Thinkphp整合微信支付功能
2016/12/14 PHP
php实现数据库的增删改查
2017/02/26 PHP
浅谈PHP面向对象之访问者模式+组合模式
2017/05/22 PHP
phpQuery采集网页实现代码实例
2020/04/02 PHP
Nigma vs AM BO3 第一场2.13
2021/03/10 DOTA
JavaScript 应用技巧集合[推荐]
2009/08/30 Javascript
js跨域问题之跨域iframe自适应大小实现代码
2010/07/17 Javascript
jquery可见性过滤选择器使用示例
2013/06/24 Javascript
两个select多选模式的选项相互移动(示例代码)
2014/01/11 Javascript
使用CSS样式position:fixed水平滚动的方法
2014/02/19 Javascript
JavaScript作用域链示例分享
2014/05/27 Javascript
js 动态修改css文件用到了cssRule
2014/08/20 Javascript
JS获取鼠标坐标位置实例分析
2016/01/20 Javascript
Backbone View 之间通信的三种方式
2016/08/09 Javascript
AngularJs ng-route路由详解及实例代码
2016/09/14 Javascript
关于Jquery中的事件绑定总结
2016/10/26 Javascript
原生js实现可爱糖果数字时间特效
2016/12/30 Javascript
js实现贪吃蛇小游戏(容易理解)
2017/01/22 Javascript
js 性能优化之算法和流程控制
2017/02/15 Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
2017/12/11 jQuery
详解angularjs 学习之 scope作用域
2018/01/15 Javascript
Vue.set()动态的新增与修改数据,触发视图更新的方法
2018/09/15 Javascript
vue的路由映射问题及解决方案
2019/10/14 Javascript
python基础教程之lambda表达式使用方法
2014/02/12 Python
利用Python如何实现数据驱动的接口自动化测试
2018/05/11 Python
基于Python对数据shape的常见操作详解
2018/12/25 Python
python快速排序的实现及运行时间比较
2019/11/22 Python
Django中使用Json返回数据的实现方法
2020/06/03 Python
CSS3的常见transformation图形变化用法小结
2016/05/13 HTML / CSS
浅谈Html5多线程开发之WebWorkers
2018/05/02 HTML / CSS
优秀护士获奖感言
2014/02/20 职场文书
学校政风行风评议工作总结
2014/10/21 职场文书
世界十大评分最高的动漫,CLANNAD上榜,第八赚足人们眼泪
2022/03/18 日漫