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.ini实现Mysql导入数据库文件最大限制的修改方法
Dec 11 PHP
PHP批量生成缩略图的代码
Jul 19 PHP
php 智能404跳转代码,适合换域名没改变目录的网站
Jun 04 PHP
PHP安全防范技巧分享
Nov 03 PHP
php 解决旧系统 查出所有数据分页的类
Aug 27 PHP
在Win7 中为php扩展配置Xcache
Oct 08 PHP
PHP的cURL库简介及使用示例
Feb 06 PHP
php中ob函数缓冲机制深入理解
Aug 03 PHP
判断、添加和删除WordPress置顶文章的相关PHP函数小结
Dec 10 PHP
PHP 获取指定地区的天气实例代码
Feb 08 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
May 08 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绘制在图片上的正余弦曲线
2013/06/08 PHP
Yii 框架控制器创建使用及控制器响应操作示例
2019/10/14 PHP
jquery ready()的几种实现方法小结
2010/06/18 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
2012/12/25 Javascript
jqeury-easyui-layout问题解决方法
2014/03/24 Javascript
JavaScript中神奇的call()方法
2015/03/12 Javascript
json+jQuery实现的无限级树形菜单效果代码
2015/08/27 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
2016/03/01 Javascript
javascript实现延时显示提示框特效代码
2016/04/27 Javascript
js基础之DOM中元素对象的属性方法详解
2016/10/28 Javascript
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
2020/11/24 Javascript
微信小程序 navbar实例详解
2017/05/11 Javascript
bootstrap-table实现服务器分页的示例 (spring 后台)
2017/09/01 Javascript
微信小程序 数据绑定及运算的简单实例
2017/09/20 Javascript
jQuery自动或手动图片切换效果
2017/10/11 jQuery
详解NodeJs开发微信公众号
2018/05/25 NodeJs
[36:05]完美世界DOTA2联赛循环赛 Forest vs DM 第一场 11.06
2020/11/06 DOTA
python测试驱动开发实例
2014/10/08 Python
用python写个自动SSH登录远程服务器的小工具(实例)
2017/06/17 Python
Python编程图形库之Pillow使用方法讲解
2018/12/28 Python
python 判断字符串中是否含有汉字或非汉字的实例
2019/07/15 Python
wxPython实现文本框基础组件
2019/11/18 Python
pycharm 实现本地写代码,服务器运行的操作
2020/06/08 Python
Python如何读写CSV文件
2020/08/13 Python
浅谈盘点5种基于Python生成的个性化语音方法
2021/02/05 Python
Swisse官方海外旗舰店:澳大利亚销量领先,自然健康品牌
2017/12/15 全球购物
Linux内核的同步机制是什么?主要有哪几种内核锁
2016/07/11 面试题
自我评价范文分享
2014/01/04 职场文书
九年级物理教学反思
2014/01/29 职场文书
财务会计自荐信范文
2014/02/21 职场文书
无传销社区工作方案
2014/05/13 职场文书
小学网上祭英烈活动总结
2014/07/05 职场文书
2016年度继续教育学习心得体会
2016/01/19 职场文书
《孙子兵法》:欲成大事者,需读懂这些致胜策略
2019/08/23 职场文书
Vue实现下拉加载更多
2021/05/09 Vue.js
zabbix配置nginx监控的实现
2022/05/25 Servers