PHP 內部如何實現打亂字串順序函式 str_shuffle
2019年春節已過,今天是上班第一天,還得翻一翻之前沒有看完的PHP原始碼。
今天聊的是字串順序打亂函式str_shuffle。這個函式本身使用頻率並不高。但是,其內部實現還是非常有趣的。
自己實現
如果在沒有看PHP原始碼內部實現之前,如果使用php實現內部字串打亂順序的操作,我能想到的是下面幾種方式。
迴圈隨機數
使用隨機數,可以有隨機取字串的字元拼接,或者順序取出,放到隨機數自定的位置。這兩種方式都涉及到隨機數重複的情況,需要去重。
這種方式的重點在於生成不重複的隨機數。
切分成陣列然後打亂順序
用陣列打亂順序的方式實現其實是有些“作弊”嫌疑。
PHP內部實現
來看看PHP內部如何實現。
其實PHP內部也是使用隨機數實現,但是他的巧妙之處在於使用隨機數抽取字串與一個特定的字串(最後一個)進行替換。這樣就不用去考慮隨機數重複的問題。不會因為重複到賬一些字串被覆蓋。
文章開始的隨機數抽取,不能保證經過n次後結束,因為需要跳過隨機數重複的情況。但是php內部的實現,都是n次迴圈後結束。在效能上肯定比需要去重的隨機數方法要好。
兩個方法的出發點都一樣,但是稍微的不一樣就可以帶來很大的提升。