前言
2019年春節(jié)已過,今天是上班第一天,還得翻一翻之前沒有看完的PHP源碼。
今天聊的是字符串順序打亂函數(shù)str_shuffle。這個函數(shù)本身使用頻率并不高。但是,其內(nèi)部實現(xiàn)還是非常有趣的。
str_shuffle() 函數(shù)隨機地打亂字符串中的所有字符。
要注意,打亂的是字符串中的“字符”
自己實現(xiàn)
如果在沒有看PHP源碼內(nèi)部實現(xiàn)之前,如果使用php實現(xiàn)內(nèi)部字符串打亂順序的操作,我能想到的是下面幾種方式。
循環(huán)隨機數(shù)
使用隨機數(shù),可以有隨機取字符串的字符拼接,或者順序取出,放到隨機數(shù)自定的位置。這兩種方式都涉及到隨機數(shù)重復(fù)的情況,需要去重。

這種方式的重點在于生成不重復(fù)的隨機數(shù)。
切分成數(shù)組然后打亂順序

用數(shù)組打亂順序的方式實現(xiàn)其實是有些“作弊”嫌疑。
PHP內(nèi)部實現(xiàn)
來看看PHP內(nèi)部如何實現(xiàn)。

其實PHP內(nèi)部也是使用隨機數(shù)實現(xiàn),但是他的巧妙之處在于使用隨機數(shù)抽取字符串與一個特定的字符串(最后一個)進行替換。這樣就不用去考慮隨機數(shù)重復(fù)的問題。不會因為重復(fù)到賬一些字符串被覆蓋。
文章開始的隨機數(shù)抽取,不能保證經(jīng)過n次后結(jié)束,因為需要跳過隨機數(shù)重復(fù)的情況。但是php內(nèi)部的實現(xiàn),都是n次循環(huán)后結(jié)束。在性能上肯定比需要去重的隨機數(shù)方法要好。
兩個方法的出發(fā)點都一樣,但是稍微的不一樣就可以帶來很大的提升。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
您可能感興趣的文章:- php使用str_shuffle()函數(shù)生成隨機字符串的方法分析