PHP內(nèi)部實(shí)現(xiàn)打亂字符串順序函數(shù)str_shuffle的方法
前言
2019年春節(jié)已過(guò),今天是上班第一天,還得翻一翻之前沒(méi)有看完的PHP源碼。
今天聊的是字符串順序打亂函數(shù)str_shuffle。這個(gè)函數(shù)本身使用頻率并不高。但是,其內(nèi)部實(shí)現(xiàn)還是非常有趣的。
str_shuffle() 函數(shù)隨機(jī)地打亂字符串中的所有字符。
要注意,打亂的是字符串中的“字符”
- 一個(gè)字母等于一個(gè)字符
- 一個(gè)漢字等于2個(gè)字符
自己實(shí)現(xiàn)
如果在沒(méi)有看PHP源碼內(nèi)部實(shí)現(xiàn)之前,如果使用php實(shí)現(xiàn)內(nèi)部字符串打亂順序的操作,我能想到的是下面幾種方式。
循環(huán)隨機(jī)數(shù)
使用隨機(jī)數(shù),可以有隨機(jī)取字符串的字符拼接,或者順序取出,放到隨機(jī)數(shù)自定的位置。這兩種方式都涉及到隨機(jī)數(shù)重復(fù)的情況,需要去重。
這種方式的重點(diǎn)在于生成不重復(fù)的隨機(jī)數(shù)。
切分成數(shù)組然后打亂順序
用數(shù)組打亂順序的方式實(shí)現(xiàn)其實(shí)是有些“作弊”嫌疑。
PHP內(nèi)部實(shí)現(xiàn)
來(lái)看看PHP內(nèi)部如何實(shí)現(xiàn)。
其實(shí)PHP內(nèi)部也是使用隨機(jī)數(shù)實(shí)現(xiàn),但是他的巧妙之處在于使用隨機(jī)數(shù)抽取字符串與一個(gè)特定的字符串(最后一個(gè))進(jìn)行替換。這樣就不用去考慮隨機(jī)數(shù)重復(fù)的問(wèn)題。不會(huì)因?yàn)橹貜?fù)到賬一些字符串被覆蓋。
文章開(kāi)始的隨機(jī)數(shù)抽取,不能保證經(jīng)過(guò)n次后結(jié)束,因?yàn)樾枰^(guò)隨機(jī)數(shù)重復(fù)的情況。但是php內(nèi)部的實(shí)現(xiàn),都是n次循環(huán)后結(jié)束。在性能上肯定比需要去重的隨機(jī)數(shù)方法要好。
兩個(gè)方法的出發(fā)點(diǎn)都一樣,但是稍微的不一樣就可以帶來(lái)很大的提升。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
基于PHP RSA密文過(guò)長(zhǎng)加密解密 越過(guò)1024的解決方法
下面小編就為大家分享一篇基于PHP RSA密文過(guò)長(zhǎng)加密解密 越過(guò)1024的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03PHP簡(jiǎn)單開(kāi)啟curl的方法(測(cè)試可行)
這篇文章主要介紹了PHP簡(jiǎn)單開(kāi)啟curl的方法,較為詳細(xì)的講述了PHP開(kāi)啟curl函數(shù)庫(kù)的具體步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-01-01php使用fputcsv()函數(shù)csv文件讀寫數(shù)據(jù)的方法
這篇文章主要介紹了php使用fputcsv()函數(shù)csv文件讀寫數(shù)據(jù)的方法,分析了fputcsv()函數(shù)針對(duì)csv文件的讀寫操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01PHP實(shí)現(xiàn)仿Google分頁(yè)效果的分頁(yè)函數(shù)
這篇文章主要介紹了PHP實(shí)現(xiàn)仿Google分頁(yè)效果的分頁(yè)函數(shù),實(shí)例分析了php實(shí)現(xiàn)分頁(yè)的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07php lcg_value與mt_rand生成0~1隨機(jī)小數(shù)的效果對(duì)比分析
下面小編就為大家?guī)?lái)一篇php lcg_value與mt_rand生成0~1隨機(jī)小數(shù)的效果對(duì)比分析。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04PHP實(shí)現(xiàn)對(duì)png圖像進(jìn)行縮放的方法(支持透明背景)
這篇文章主要介紹了PHP實(shí)現(xiàn)對(duì)png圖像進(jìn)行縮放的方法(支持透明背景),可實(shí)現(xiàn)php針對(duì)png圖像的縮放功能,且支持透明背景,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07PHP學(xué)習(xí)筆記之?dāng)?shù)組篇
其實(shí)PHP中的數(shù)組和JavaScript中的數(shù)組很相似,就是一系列鍵值對(duì)的集合。2011-06-06PHP 二級(jí)子目錄(后臺(tái)目錄)設(shè)置二級(jí)域名
本文主要介紹了PHP 二級(jí)子目錄(后臺(tái)目錄)設(shè)置二級(jí)域名的方法。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-03-03php+jquery編碼方面的一些心得(utf-8 gb2312)
在開(kāi)發(fā)php與jquery的過(guò)程中,需要注意的一些心得,防止亂碼的出現(xiàn)。2010-10-10