php 將字符串打亂,PHP內部實現打亂字符串順序函數str_shuffle的方法

前言

2019年春節已過,今天是上班第一天,還得翻一翻之前沒有看完的PHP源碼。

今天聊的是字符串順序打亂函數str_shuffle。這個函數本身使用頻率并不高。但是,其內部實現還是非常有趣的。

str_shuffle() 函數隨機地打亂字符串中的所有字符。

要注意,打亂的是字符串中的“字符”

一個字母等于一個字符

一個漢字等于2個字符

自己實現

如果在沒有看PHP源碼內部實現之前,如果使用php實現內部字符串打亂順序的操作,我能想到的是下面幾種方式。

循環隨機數

使用隨機數,可以有隨機取字符串的字符拼接,或者順序取出,放到隨機數自定的位置。這兩種方式都涉及到隨機數重復的情況,需要去重。

這種方式的重點在于生成不重復的隨機數。

切分成數組然后打亂順序

用數組打亂順序的方式實現其實是有些“作弊”嫌疑。

PHP內部實現

來看看PHP內部如何實現。

其實PHP內部也是使用隨機數實現,但是他的巧妙之處在于使用隨機數抽取字符串與一個特定的字符串(最后一個)進行替換。這樣就不用去考慮隨機數重復的問題。不會因為重復到賬一些字符串被覆蓋。

文章開始的隨機數抽取,不能保證經過n次后結束,因為需要跳過隨機數重復的情況。但是php內部的實現,都是n次循環后結束。在性能上肯定比需要去重的隨機數方法要好。

兩個方法的出發點都一樣,但是稍微的不一樣就可以帶來很大的提升。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對的支持。 ad51e517755f8fd6a7ec83ced4ecfaf3.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530133.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530133.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530133.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php+js+return+true,js中return、return false、return true的區別

1.語法及返回方式①返回控制與函數結果語法為:return 表達式;語句結果函數的執行,返回調用函數,而且把表達式的值作為函數結果返回出去②返回控制無函數結果語法為:return;在大多數情況下,為事件處理函數如果讓其返回false,可以防止默認的事件行為.例如,默認情況下,點擊一個標簽…

php strlen遇0截斷,聊下php下的截斷問題

0x01 起因有天在群里說起上傳的%00截斷的一些問題,就想起之前自己在這個問題踩過坑,想起了自己曾經的flag說要寫文章,一直沒寫,現在來填坑了。0x02 經過源碼理解1234//test.phpinclude "1.txt\000.jpg";?>1234//1.t…

test.php.bak,記一次phpmyadmin 4.8.1 遠程文件包含漏洞(BUUCTF web)

題目很簡單,一個滑稽打開源碼,發現存在source.php文件于是訪問文件,發現出現一串php源碼提示存在hint.php,于是訪問發現一句話flag not here, and flag in ffffllllaaaagggg再回過頭來觀察source.php明顯是一道代碼審計的問題&…

php中files和FILRS,php獲取文件內容最后一行示例

php獲取文件內容最后一行示例復制代碼 代碼如下:$rs README.md;$fp fopen($rs, r);fseek($fp,-1,SEEK_END);$s ;while(($c fgetc($fp)) ! false){if($c "\n" && $s) break;$s $c . $s;fseek($fp, -2, SEEK_CUR);}fclose($fp);echo $s;exit;時間&#x…

php 實現貪吃蛇游戲,C++實現簡單貪吃蛇游戲

我大概在一個多月前把自己上學期寫的c代碼的貪吃蛇游戲push到csdn上,并且說c風格的貪吃蛇寫起來有些麻煩(貪吃蛇游戲的c語言實現),準備用面向對象的c再寫一遍。現在我們專業恰好剛教完了c,學校也布置了一道簡單的貪吃蛇的編程題目&#xff0c…

java中的斜杠和反斜杠,老生常談java路徑中的反斜杠和斜杠的區別

JAVA中的斜杠有正斜杠與反斜杠之分,正斜杠,一般就叫做斜杠,符號為“/”;反斜杠的符號為“\”。斜杠(/)在JAVA中沒有什么特別的意義,就是代表一個字符‘/;反斜杠(\)則不然,它和緊跟著它的那個字符構成轉義字…

小程序 php cookie,微信小程序使用Cookie

微信小程序使用Cookie微信小程序不支持Cookie,因此,需要借助小程序的數據緩存來實現Cookie.環境: mpvue fly.js登錄成功后,在處理登錄驗證的method里,加入以下內容保存Cookie:wx.setStorageSync("sessionid",response.headers["set-cookie"][0])我對fly.j…

php對象好用嗎,在數據庫中使用對象的好處_php

我們都知道如何從mysql獲取我們需要的行(記錄),讀取數據,然后存取一些改動。很明顯也很直接,在這個過程背后也沒有什么拐彎抹角的。然而對于我們使用面對對象的程序設計(OOP)來管理我們數據庫中的數據時,這個過程就需要大大改進一…

linux apache php顯示源碼,linux 源碼安裝apache PHP 問題

sudo ./configure --prefix/var/php --with-apxs2/usr/local/apache2/bin/apxsLoadModule php5_module modules/libphp5.soDirectoryIndex index.html index.html.var .phpa-bash-3.2$ pwd/usr/local/apache2/htdocs-bash-3.2$ cat info.phpphpinfo();?>打開info.ph…

mysql臨時表的的理解,如何理解存儲過程中已存在的mysql臨時表?

它在創建表時具有IF NOT EXISTS(13.1.17. CREATE TABLE Syntax)選項,在這種情況下可以使用.例:DELIMITER $$CREATE PROCEDURE temp_sp1()BEGINCREATE TEMPORARY TABLE IF NOT EXISTS temp_table (col2 int(11) DEFAULT NULL,col3 int(11) DEFAULT NULL);INSERT INTO…

python 發郵件 抄送,Python調用outlook發送郵件,發送給多人、抄送給多人并帶上附件...

我的報告目錄具體解釋在代碼中有詳細注釋import win32com.client as win32import datetime, osaddressee test01qq.com;test02jd.com#收件人郵箱列表cc test02163.com;test03alibaba.com#抄送人郵件列表mail_path os.path.join(rC:\Users\songlihui\PycharmProjects\test001…

php阻止輸入sql,在PHP中全面阻止SQL注入式攻擊之三

一、 建立一個安全抽象層我們并不建議你手工地把前面介紹的技術應用于每一個用戶輸入的實例中,而是強烈推薦你為此創建一個抽象層。一個簡單的抽象是把你的校驗方案加入到一個函數中,并且針對用戶輸入的每一項調用這個函數。當然,我們還可以創…

Oracle12081,【Oracle介質】Oracle 12C Linux x86-64 最新OPatch patch 6880880 12.2.0.1.7

天萃荷凈Linux x86-64 補丁程序6880880: OPatch patch of version 12.2.0.1.7 for Oracle software releases 12.1.0.x (installer) and 12.2.0.x (AUG 2016)上次更新時間 2016-8-26 上午1:48 (8 天前)產品 Oracle Global Lifecycle Management OPatc…

如何使用oracle ebs,Oracle EBS進行集成的實際操作步驟

我們今天主要向大家介紹的是如何使用WebService和Oracle EBS進行集成,以及在使用WebService和Oracle EBS進行集成時,所需要的一些項目的描述,以下的文章就是對相關內容的描述。架構系統從總體上分為兩部分,一部為企業的EBS及接口系…

linux nls_lang oracle,linux操作系統環境變量LANG和NLS_LANG的區別

例如:復制代碼代碼如下:export LANGzh_CN.GB2312export NLS_LANGAMERICAN_AMERICA.ZHS16GBK$export LANGzh_CN.GB2312$date2012年 11月 27日 星期二 16:20:35 CST顯示是中文界面。復制代碼代碼如下:$export NLS_LANGAMERICAN_AMERICA.ZHS16GBK$sqlplus / as sysdbaS…

oracle監聽 3個配置文件,Oracle 11g 監聽 配置修改 說明

這里我們看2個比較常用的操作。1. 停止寫listener log在某些特定的場合可能會有這樣的需求。控制這個功能的參數是LOG_STATUS。 官網對這個參數的說明:To turn listenerlogging on or off.--在OS層面直接使用:lsnrctl SET LOG_STATUS {on | off}--在LSNR…

suse linux如何重置密碼忘記,SUSE?Linux忘記root密碼的處理辦法

GRUB修改法注意:此辦法僅適用SLES8、SLES9,不適用于SLES10,SLES10請用光盤修改法。此辦法不適合用于grub啟動超時時間為0的機器,因為grub超時時間設置為0后,不能編輯grub選項,此類機器必須使用光盤或網絡引…

linux怎么啟動端口服務,Linux 根據端口快速停止服務并啟動的辦法

ll /proc/7167結果為:[rootcentos76 deploy]# ll /proc/7167total 0dr-xr-xr-x 2 root root 0 Jun 25 11:13 attr-rw-r--r-- 1 root root 0 Jun 25 11:13 autogroup-r-------- 1 root root 0 Jun 25 11:13 auxv-r--r--r-- 1 root root 0 Jun 25 11:05 cgroup--w------- 1 root …

linux進程增刪改查,iptables的增刪改查

iptables是自帶的防火墻,功能強大,學習起來需要一段時間,下面是一些習iptables的時候的記錄。如果iptables不熟悉的話可以用apf,是一款基于iptables的防火墻,挺好用的。一,安裝并啟動防火墻[root ~]# /etc/init.d/ipta…

重裝系統 linux啟動windows系統文件在哪里,Win-Lin雙系統重裝Windows找回Linux啟動

第一系統Windows,第二系統Linux:Ubuntu18.10;1. 重新安裝Windows系統后,使用Ubuntu的安裝光盤,或啟動U盤啟動電腦;2. 選擇:Try Ubuntu ;3. 進入Ubuntu界面,打開命令行終端(Ctrl Alt…