導航:首頁 > 編程語言 > php填充字元串

php填充字元串

發布時間:2023-07-17 17:08:19

php:如何生成隨機的唯一字母數字字元串

1. 自己寫代碼產生隨機的數字和字母組合,每產生1個去資料庫查詢該隨機碼是否已存在,如果已存在,則重新產生,直到不重復為止。
缺點:產生速度慢,還要查詢資料庫,當數據量大的時候,可能重復的機率會比較高,要查詢多次資料庫.
2. guid,該方法應該是用的比較多的。
優點:使用簡單方便,不用自己編寫額外的代碼
缺點:佔用資料庫空間相對較大,特別是根據guid查詢速度比較慢(畢竟是字元串)。
3. 主鍵+隨機碼的方式,我們產生的隨機碼保存到資料庫肯定會有個主鍵,用該主鍵+隨機字元來組合。產生步驟:
1) 先從id生成器中獲取id,比如是155.
2)填充成固定位數(比如8位)的字元串(不夠位數的左邊填0,超過位數直接使用該數字),得到:00000155
3)在每個數字後面隨機插入1個字母或其它非數字元號,得到:0A0F0R0Y0H1K5L5M
這樣就可以得到1個隨機的唯一的邀請碼了。
優點:使用也比較簡單,不用查詢資料庫。最大的優點是查詢的時候,可以根據邀請碼直接得到主鍵id,然後根據id去資料庫查詢(速度很快),再比較查詢出來的邀請碼和用戶提交的邀請碼是否一致。
缺點:需要使用id產生器,如果主鍵是資料庫自增長的就不太好用(需要先插入資料庫獲取id,再更新邀請碼)。
4. 有時候產品經理說,我要求邀請碼都是數字的。把方法3變通下就可以實現唯一的純數字隨機碼了。
1) 獲取id: 155
2) 轉換成8進制:233
3) 轉為字元串,並在後面加'9'字元:2339
4)在後面隨機產生若干個隨機數字字元:2003967524987
轉為8進制後就不會出現9這個字元,然後在後面加個'9',這樣就能確定唯一性。最後在後面產生一些隨機數字就可以。

㈡ 解析PHP中的內存管理,PHP動態分配和釋放內存

本篇文章是對PHP中的內存管理 PHP動態分配和釋放內存進行了詳細的分析介紹 需要的朋友參考下

摘要 內存管理對於長期運行的程序 例如伺服器守護程序 是相當重要的影響 因此 理解PHP是如何分配與釋放內存的對於創建這類程序極為重要 本文將重點探討PHP的內存管理問題

一 內存 在PHP中 填充一個字元串變數相當簡單 這只需要一個語句"<?php $str = hello world ; ?>"即可 並且該字元串能夠被自由地修改 拷貝和移動 而在C語言中 盡管你能夠編寫例如"char *str = "hello world ";"這樣的一個簡單的靜態字元串 但是 卻不能修改該字元串 因為它生存於程序空間內 為了創建一個可操縱的字元串 你必須分配一個內存塊 並且通過一 個函數(例如strp())來復制其內容

復制代碼 代碼如下: { char *str; str = strp("hello world"); if (!str) { fprintf(stderr "Unable to allocate memory!"); } }

由於後面我們將分析的各種原因 傳統型內存管理函數(例如malloc() free() strp() realloc() calloc() 等等)幾乎都不能直接為PHP源代碼所使用

二 釋放內存 在幾乎所有的平台上 內存管理都是通過一種請求和釋放模式實現的 首先 一個應用程序請求它下面的層(通常指"操作系統") "我想使用一些內存空間" 如果存在可用的空間 操作系統就會把它提供給該程序並且打上一個標記以便不會再把這部分內存分配給其它程序 當 應用程序使用完這部分內存 它應該被返回到OS 這樣以來 它就能夠被繼續分配給其它程序 如果該程序不返回這部分內存 那麼OS無法知道是否這塊內存不 再使用並進而再分配給另一個進程 如果一個內存塊沒有釋放 並且所有者應用程序丟失了它 那麼 我們就說此應用程序"存在漏洞" 因為這部分內存無法再為 其它程序可用 在一個典型的客戶端應用程序中 較小的不太經常的內存泄漏有時能夠為OS所"容忍" 因為在這個進程稍後結束時該泄漏內存會被隱式返回到OS 這並沒有什麼 因為OS知道它把該內存分配給了哪個程序 並且它能夠確信當該程序終止時不再需要該內存 而對於長時間運行的伺服器守護程序 包括象Apache這樣的web伺服器和擴展php模塊來說 進程往往被設計為相當長時間一直運行 因為OS不能清理內存使用 所以 任何程序的泄漏 無論是多麼小 都將導致重復操作並最終耗盡所有的系統資源 現 在 我們不妨考慮用戶空間內的stristr()函數 為了使用大小寫不敏感的搜索來查找一個字元串 它實際上創建了兩個串的各自的一個小型副本 然後執 行一個更傳統型的大小寫敏感的搜索來查找相對的偏移量 然而 在定位該字元串的偏移量之後 它不再使用這些小寫版本的字元串 如果它不釋放這些副本 那 么 每一個使用stristr()的腳本在每次調用它時都將泄漏一些內存 最後 web伺服器進程將擁有所有的系統內存 但卻不能夠使用它 你可以理直氣壯地說 理想的解決方案就是編寫良好 干凈的 一致的代碼 這當然不錯 但是 在一個象PHP解釋器這樣的環境中 這種觀點僅對了一半

三 錯誤處理 為了實現"跳出"對用戶空間腳本及其依賴的擴展函數的一個活動請求 需要使用一種方法來 完全"跳出"一個活動請求 這是在Zend引擎內實現的 在一個請求的開始設置一個"跳出"地址 然後在任何die()或exit()調用或在遇到任何關 鍵錯誤(E_ERROR)時執行一個longjmp()以跳轉到該"跳出"地址 盡管這個"跳出"進程能夠簡化程序執行的流程 但是 在絕大多數情況下 這會意味著將會跳過資源清除代碼部分(例如free()調用)並最終導致出現內存漏洞 現在 讓我們來考慮下面這個簡化版本的處理函數調用的引擎代碼

復制代碼 代碼如下: void call_function(const char *fname int fname_len TSRMLS_DC){ zend_function *fe; char *lcase_fname; /* PHP函數名是大小寫不敏感的 *為了簡化在函數表中對它們的定位 *所有函數名都隱含地翻譯為小寫的 */ lcase_fname = estrnp(fname fname_len); zend_str_tolower(lcase_fname fname_len); if (zend_hash_find(EG(function_table) lcase_fname fname_len + (void **)&fe) == FAILURE) { zend_execute(fe >op_array TSRMLS_CC); } else { php_error_docref(NULL TSRMLS_CC E_ERROR "Call to undefined function: %s()" fname); } efree(lcase_fname); }

當 執行到php_error_docref()這一行時 內部錯誤處理器就會明白該錯誤級別是critical 並相應地調用longjmp()來中斷當前 程序流程並離開call_function()函數 甚至根本不會執行到efree(lcase_fname)這一行 你可能想把efree()代碼行移 動到zend_error()代碼行的上面 但是 調用這個call_function()常式的代碼行會怎麼樣呢?fname本身很可能就是一個分配的 字元串 並且 在它被錯誤消息處理使用完之前 你根本不能釋放它 注意 這個php_error_docref()函數是trigger_error()函數的一個內部等價實現 它的第一個參數是一個將被添加到docref的可選的文檔引用 第三個參數可以是任何我們熟悉的E_*家族常量 用於指示錯誤的嚴重程度 第四個參數(最後一個)遵循printf()風格的格式化和變數參數列表式樣 四 Zend內存管理器 在 上面的"跳出"請求期間解決內存泄漏的方案之一是 使用Zend內存管理(ZendMM)層 引擎的這一部分非常類似於操作系統的內存管理行為 分配內存 給調用程序 區別在於 它處於進程空間中非常低的位置而且是"請求感知"的 這樣以來 當一個請求結束時 它能夠執行與OS在一個進程終止時相同的行為 也就是說 它會隱式地釋放所有的為該請求所佔用的內存 圖 展示了ZendMM與OS以及PHP進程之間的關系 圖 Zend內存管理器代替系統調用來實現針對每一種請求的內存分配 除 了提供隱式內存清除功能之外 ZendMM還能夠根據php ini中memory_limit的設置控制每一種內存請求的用法 如果一個腳本試圖請求比 系統中可用內存更多的內存 或大於它每次應該請求的最大量 那麼 ZendMM將自動地發出一個E_ERROR消息並且啟動相應的"跳出"進程 這種方法 的一個額外優點在於 大多數內存分配調用的返回值並不需要檢查 因為如果失敗的話將會導致立即跳轉到引擎的退出部分 把PHP內部代碼和 OS的實際的內存管理層"鉤"在一起的原理並不復雜 所有內部分配的內存都要使用一組特定的可選函數實現 例如 PHP代碼不是使用malloc( ) 來分配一個 位元組內存塊而是使用了emalloc( ) 除了實現實際的內存分配任務外 ZendMM還會使用相應的綁定請求類型來標志該內存塊 這 樣以來 當一個請求"跳出"時 ZendMM可以隱式地釋放它 經常情況下 內存一般都需要被分配比單個請求持續時間更長的一段時間 這 種類型的分配(因其在一次請求結束之後仍然存在而被稱為"永久性分配") 可以使用傳統型內存分配器來實現 因為這些分配並不會添加ZendMM使用的那 些額外的相應於每種請求的信息 然而有時 直到運行時刻才會確定是否一個特定的分配需要永久性分配 因此ZendMM導出了一組幫助宏 其行為類似於其它 的內存分配函數 但是使用最後一個額外參數來指示是否為永久性分配 如果你確實想實現一個永久性分配 那麼這個參數應該被設置為 在這 種情況下 請求是通過傳統型malloc()分配器家族進行傳遞的 然而 如果運行時刻邏輯認為這個塊不需要永久性分配 那麼 這個參數可以被設置為零 並且調用將會被調整到針對每種請求的內存分配器函數 例如 pemalloc(buffer_len )將映射到malloc(buffer_len) 而pemalloc(buffer_len )將被使用下列語句映射到emalloc(buffer_len) #define in Zend/zend_alloc h: #define pemalloc(size persistent) ((persistent)?malloc(size): emalloc(size)) 所有這些在ZendMM中提供的分配器函數都能夠從下表中找到其更傳統的對應實現 表格 展示了ZendMM支持下的每一個分配器函數以及它們的e/pe對應實現 表格 傳統型相對於PHP特定的分配器

分配器函數 e/pe對應實現 void *malloc(size_t count); void *emalloc(size_t count);void *pemalloc(size_t count char persistent); void *calloc(size_t count); void *ecalloc(size_t count);void *pecalloc(size_t count char persistent); void *realloc(void *ptr size_t count); void *erealloc(void *ptr size_t count); void *perealloc(void *ptr size_t count char persistent); void *strp(void *ptr); void *estrp(void *ptr);void *pestrp(void *ptr char persistent); void free(void *ptr); void efree(void *ptr); void pefree(void *ptr char persistent);

你可能會注意到 即使是pefree()函數也要求使用永久性標志 這是因為在調用pefree()時 它實際上並不知道是否ptr是一種永久性分 配 針對一個非永久性分配調用free()能夠導致雙倍的空間釋放 而針對一種永久性分配調用efree()有可能會導致一個段錯誤 因為內存管理器會試 圖查找並不存在的管理信息 因此 你的代碼需要記住它分配的數據結構是否是永久性的 除了分配器函數核心部分外 還存在其它一些非常方便的ZendMM特定的函數 例如 void *estrnp(void *ptr int len); 該函數能夠分配len+ 個位元組的內存並且從ptr處復制len個位元組到最新分配的塊 這個estrnp()函數的行為可以大致描述如下

復制代碼 代碼如下: void *estrnp(void *ptr int len) { char *dst = emalloc(len + ); memcpy(dst ptr len); dst[len] = ; return dst; }

在 此 被隱式放置在緩沖區最後的NULL位元組可以確保任何使用estrnp()實現字元串復制操作的函數都不需要擔心會把結果緩沖區傳遞給一個例如 printf()這樣的希望以為NULL為結束符的函數 當使用estrnp()來復制非字元串數據時 最後一個位元組實質上都浪費了 但其中的利明顯 大於弊 void *safe_emalloc(size_t size size_t count size_t addtl); void *safe_pemalloc(size_t size size_t count size_t addtl char persistent); 這 些函數分配的內存空間最終大小是((size*count)+addtl) 你可以會問 "為什麼還要提供額外函數呢?為什麼不使用一個 emalloc/pemalloc呢?"原因很簡單 為了安全 盡管有時候可能性相當小 但是 正是這一"可能性相當小"的結果導致宿主平台的內存溢出 這可能會導致分配負數個數的位元組空間 或更有甚者 會導致分配一個小於調用程序要求大小的位元組空間 而safe_emalloc()能夠避免這種類型的陷 井 通過檢查整數溢出並且在發生這樣的溢出時顯式地預以結束 注意 並不是所有的內存分配常式都有一個相應的p*對等實現 例如 不存在pestrnp() 並且在PHP 版本前也不存在safe_pemalloc()

五 引用計數 慎重的內存分配與釋放對於PHP(它是一種多請求進程)的長期性能有極其重大的影響 但是 這還僅是問題的一半 為了使一個每秒處理上千次點擊的伺服器高效地運行 每一次請求都需要使用盡可能少的內存並且要盡可能減少不必要的數據復制操作 請考慮下列PHP代碼片斷

復制代碼 代碼如下: <?php $a = Hello World ; $b = $a; unset($a); ?>

在第一次調用之後 只有一個變數被創建 並且一個 位元組的內存塊指派給它以便存儲字元串"Hello World" 還包括一個結尾處的NULL字元 現在 讓我們來觀察後面的兩行 $b被置為與變數$a相同的值 然後變數$a被釋放 如 果PHP因每次變數賦值都要復制變數內容的話 那麼 對於上例中要復制的字元串還需要復制額外的 個位元組 並且在數據復制期間還要進行另外的處理器加 載 這一行為乍看起來有點荒謬 因為當第三行代碼出現時 原始變數被釋放 從而使得整個數據復制顯得完全不必要 其實 我們不妨再遠一層考慮 讓我們設想 當一個 MB大小的文件的內容被裝載到兩個變數中時會發生什麼 這將會佔用 MB的空間 此時 已經足夠了 引擎會把那麼多的時間和內存浪費在這 樣一種無用的努力上嗎? 你應該知道 PHP的設計者早已深諳此理 記住 在引擎中 變數名和它們的值實際上是兩個不同的概念 值本身是一個無名的zval*存儲體(在本例中 是一個字元串值) 它被通過zend_hash_add()賦給變數$a 如果兩個變數名都指向同一個值 會發生什麼呢?

復制代碼 代碼如下: { zval *helloval; MAKE_STD_ZVAL(helloval); ZVAL_STRING(helloval "Hello World" ); zend_hash_add(EG(active_symbol_table) "a" sizeof("a") &helloval sizeof(zval*) NULL); zend_hash_add(EG(active_symbol_table) "b" sizeof("b") &helloval sizeof(zval*) NULL); }

此 時 你可以實際地觀察$a或$b 並且會看到它們都包含字元串"Hello World" 遺憾的是 接下來 你繼續執行第三行代碼"unset($a);" 此時 unset()並不知道$a變數指向的數據還被另一個變數所使 用 因此它只是盲目地釋放掉該內存 任何隨後的對變數$b的存取都將被分析為已經釋放的內存空間並因此導致引擎崩潰 這個問題可以藉助於 zval(它有好幾種形式)的第四個成員refcount加以解決 當一個變數被首次創建並賦值時 它的refcount被初始化為 因為它被假定僅由 最初創建它時相應的變數所使用 當你的代碼片斷開始把helloval賦給$b時 它需要把refcount的值增加為 這樣以來 現在該值被兩個變數 所引用

復制代碼 代碼如下: { zval *helloval; MAKE_STD_ZVAL(helloval); ZVAL_STRING(helloval "Hello World" ); zend_hash_add(EG(active_symbol_table) "a" sizeof("a") &helloval sizeof(zval*) NULL); ZVAL_ADDREF(helloval); zend_hash_add(EG(active_symbol_table) "b" sizeof("b") &helloval sizeof(zval*) NULL); }

現在 當unset()刪除原變數的$a相應的副本時 它就能夠從refcount參數中看到 還有另外其他人對該數據感興趣 因此 它應該只是減少refcount的計數值 然後不再管它

六 寫復制(Copy on Write) 通過refcounting來節約內存的確是不錯的主意 但是 當你僅想改變其中一個變數的值時情況會如何呢?為此 請考慮下面的代碼片斷

復制代碼 代碼如下: <?php $a = ; $b = $a; $b += ; ?>

通過上面的邏輯流程 你當然知道$a的值仍然等於 而$b的值最後將是 並且此時 你還知道 Zend在盡力節省內存 通過使$a和$b都引用相同的zval(見第二行代碼) 那麼 當執行到第三行並且必須改變$b變數的值時 會發生什麼情況呢? 回答是 Zend要查看refcount的值 並且確保在它的值大於 時對之進行分離 在Zend引擎中 分離是破壞一個引用對的過程 正好與你剛才看到的過程相反

復制代碼 代碼如下: zval *get_var_and_separate(char *varname int varname_len TSRMLS_DC) { zval **varval *var; if (zend_hash_find(EG(active_symbol_table) varname varname_len + (void**)&varval) == FAILURE) { /* 變數根本並不存在 失敗而導致退出*/ return NULL; } if ((*varval) >refcount < ) { /* varname是唯一的實際引用 *不需要進行分離 */ return *varval; } /* 否則 再復制一份zval*的值*/ MAKE_STD_ZVAL(var); var = *varval; /* 復制任何在zval*內的已分配的結構*/ zval__ctor(var); /*刪除舊版本的varname *這將減少該過程中varval的refcount的值 */ zend_hash_del(EG(active_symbol_table) varname varname_len + ); /*初始化新創建的值的引用計數 並把它依附到 * varname變數 */ var >refcount = ; var >is_ref = ; zend_hash_add(EG(active_symbol_table) varname varname_len + &var sizeof(zval*) NULL); /*返回新的zval* */ return var; }

現在 既然引擎有一個僅為變數$b所擁有的zval*(引擎能知道這一點) 所以它能夠把這個值轉換成一個long型值並根據腳本的請求給它增加

七 寫改變(change on write) 引用計數概念的引入還導致了一個新的數據操作可能性 其形式從用戶空間腳本管理器看來與"引用"有一定關系 請考慮下列的用戶空間代碼片斷

復制代碼 代碼如下: <?php $a = ; $b = &$a; $b += ; ?>

在 上面的PHP代碼中 你能看出$a的值現在為 盡管它一開始為 並且從未(直接)發生變化 之所以會發生這種情況是因為當引擎開始把$b的值增加 時 它注意到$b是一個對$a的引用並且認為"我可以改變該值而不必分離它 因為我想使所有的引用變數都能看到這一改變" 但是 引擎是如何 知道的呢?很簡單 它只要查看一下zval結構的第四個和最後一個元素(is_ref)即可 這是一個簡單的開/關位 它定義了該值是否實際上是一個用戶 空間風格引用集的一部分 在前面的代碼片斷中 當執行第一行時 為$a創建的值得到一個refcount為 還有一個is_ref值為 因為它僅為一 個變數($a)所擁有並且沒有其它變數對它產生寫引用改變 在第二行 這個值的refcount元素被增加為 除了這次is_ref元素被置為 之外 (因為腳本中包含了一個"&"符號以指示是完全引用) 最後 在第三行 引擎再一次取出與變數$b相關的值並且檢查是否有必要進行分離 這一次該值沒有被分離 因為前面沒有包括一個檢查 下面是get_var_and_separate()函數中與refcount檢查有關的部分代碼

復制代碼 代碼如下: if ((*varval) >is_ref || (*varval) >refcount < ) { /* varname是唯一的實際引用 * 或者它是對其它變數的一個完全引用 *任何一種方式 都沒有進行分離 */ return *varval; }

這一次 盡管refcount為 卻沒有實現分離 因為這個值是一個完全引用 引擎能夠自由地修改它而不必關心其它變數值的變化

八 分離問題 盡管已經存在上面討論到的復制和引用技術 但是還存在一些不能通過is_ref和refcount操作來解決的問題 請考慮下面這個PHP代碼塊

復制代碼 代碼如下: <?php $a = ; $b = $a; $c = &$a; ?>

在 此 你有一個需要與三個不同的變數相關聯的值 其中 兩個變數是使用了"change on write"完全引用方式 而第三個變數處於一種可分離 的" on write"(寫復制)上下文中 如果僅使用is_ref和refcount來描述這種關系 有哪些值能夠工作呢? 回答是 沒有一個能工作 在這種情況下 這個值必須被復制到兩個分離的zval*中 盡管兩者都包含完全相同的數據(見圖 )

圖 引用時強制分離

同樣 下列代碼塊將引起相同的沖突並且強迫該值分離出一個副本(見圖 )

圖 復制時強制分離

復制代碼 代碼如下: <?php $a = ; $b = &$a; $c = $a; ?> lishixin/Article/program/PHP/201311/20951

㈢ php 如何將一串字元插入到另一串字元串的指定位置

以下是一個參考函數,

參數$str為,原始字元串,例如123456。

參數$i為,要插入的位置。

參數$substr為,要插入的字元串,例如hello。

返回值為最後結果,例如12345hello6

functionstr_insert($str,$i,$substr)
{
for($j=0;$j<$i;$j++){
$startstr.=$str[$j];
}
for($j=$i;$j<strlen($str);$j++){
$laststr.=$str[$j];
}
$str=($startstr.$substr.$laststr);
return$str;
}

㈣ 經典PHP筆試題

經典PHP筆試題

PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本預處理器”)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域。下面是整理的關於經典PHP筆試題,歡迎閱讀!

1.考慮如下腳本。標記處應該添加什麼代碼才能讓腳本輸出字元串php?

$alpha = 'abcdefghijklmnopqrstuvwxyz';

$letters = array(15, 7, 15);

foreach($letters as $val)

{/* 這里應該加入什麼 */

}?>

A.echo chr($val);

B.echo asc($val);

C.echo substr($alpha, $val, 2);

D.echo $alpha{$val};

E.echo $alpha{$val+1}

答案解析:substr 函數能夠勝任,但考慮到輸出三個字母就需要三次調用該函數,所以排除此方法。那麼$alpha{$val}和$alpha{$val+1}是僅有的兩個可能輸出題目要求的字元串的選項。因為 0 是數

組的第一個索引,所以答案是 D。

2. 以下哪一項不能把字元串$s1 和$s2 組成一個字元串?

A.$s1 + $s2

B.”{$s1}{$s2}”

C.$s1.$s2

D.implode(”, array($s1,$s2))

E.以上都可以

答案解析:除 A 以外的選項都能輸出題目要求的字元串。PHP中,加號+不能把兩個字元串合並成一個。

3. 變 量 $email 的 值 是 字 符 串 [email protected] , 以 下 哪 項 能 把 字 符 串 轉 化 成example.com?

A.substr($email, strpos($email, “@”));

B.strstr($email, “@”);

C.strchr($email, “@”);

D.substr($email, strpos($email, “@”)+1);

E.strrpos($email, “@”);

答案解析:substr 函數返回字元串的一部分,而 strpos 函數擅長從一個字元串中找出某個指定的子串。同時使用這兩個函數將滿足題目要求。注意,前一個函數從 0 開始索引,而後者不是,因此需

要+1。答案是 D。

4. 給定一個用逗號分隔一組值的字元串,以下哪個函數能在僅調用一次的情況下就把每個獨立的值放入一個新創建的數組?

A.strstr()

B.不可能只調用一次就完成

C.extract()

D.explode()

E.strtok()

答案解析:答案是 D。explode 函數使用一個字元串分隔另一個字元串,並把結果放入一個新建的數組。strtok 函數也可以做同樣的事,但需要多次調用。

5. 要比較兩個字元串,以下那種方法最萬能?

A.用 strpos 函數

B.用==操作符

C.用 strcasecmp()

D.用 strcmp()

答案解析:答案是 D。strcmp()提供了安全的字元串比較機制。注意,選項 C 是錯的,strcasecmp()不是一個“萬能”函數,因為它不區分大小寫。

6. 以下哪個 PCRE 正則表達式能匹配字元串 php|architect?

A..*

B.…|………

C.d{3}|d{8}

D.[az]{3}|[az]{9}

E.[a-z][a-z][a-z]|w{9}

答案解析:選項中沒有一個正則表達式能真正代表題目所給字元串的匹配方式,但是選項 A 和 E仍然能勉強匹配。選項 A 太普通了,它能夠匹配任何字元串,因此答案是 E。

7. 以下哪些函數能用來驗證字元串的完整性?(三選)

A.md5()

B.sha1()

C.str_rot13()

D.crypt()

E.crc32()

答案解析:正確答案是 A,B 和 E。用 crypt()和 str_rot13()來驗證一個字元串是否被改變,效率很低。crc32()比前面兩個函數好些,如果能容忍一些小錯誤的話,它是個不錯的選擇。

8. 哪個 PHP 函數與以下腳本在 UNIX 系統下執行的效果近似?

function my_funct ($filename)

{

$f = file_get_contents ($filename);

return explode (" ", $f);

}

?>

A.fopen()

B.fread()

C.flock()

D.split_string()

E.file()

答案解析:正確答案是 A,B 和 E。用 crypt()和 str_rot13()來驗證一個字元串是否被改變,效率很低。crc32()比前面兩個函數好些,如果能容忍一些小錯誤的話,它是個不錯的選擇。

9. 基於指定的式樣(pattern)把一個字元串分隔開並放入數組,以下哪些函數能做到?(雙

選)

A.preg_split()

B.ereg()

C.str_split()

D.explode()

E.chop()

答案解析:盡管條件不同,但 preg_split 和 explode 函數都能滿足題目要求。ereg()拿一個正則表達式匹配一個字元串;str_split()按固定長度分隔字元串;而 chop()則是 rtrim()別名,用來移除

字元串末尾處的空格。

10.以下腳本輸出什麼?

echo 'Testing ' . 1 + 2 . '45';

?>

A.Testing 1245

B.Testing 345

C.Testing 1+245

D.245

E.什麼都沒有

答案解析:本題考察你對字元串操作及操作符優先順序的認識。連接運算符(.)的優先順序比加號(+)高。因此 PHP 解釋器實際執行的運算可以表示為(‘Testing’ . 1) + (2 . ‘45’)。由於字元串

test 1 不是數字,所以加號前面的運算等於 0。加號後面的運算等於 245,PHP 輸出的'結果是 0+245,等於 245,所以答案是 D。

11.以下腳本輸出什麼?

$s = '12345';

$s[$s[1]] = '2';

echo $s;

?>

A.12345

B.12245

C.22345

D.11345

E.Array

答案解析:可以用訪問數組元素的方式訪問字元串中的字元,因此腳本只是把字元串中的第二個字元($s[1])替換成了字元 2,最終將輸出 12245。答案是 B。

12.方框中的正則表達式能與以下哪些選項匹配?(雙選)

/.**123d/

A.******123

B.*****_1234

C.******1234

D._*1234

E._*123

答案解析:本題的要點是理解這個正則表達式的含義——從左往右,首先是零個或多個任意字元(.*),跟著是一個星號(*),然後是 123,最後是一個數字。因此答案是 C 和 D。

13.以下哪個比較將返回 true?(雙選)

A.‘1top’ == ‘1’

B.‘top’ == 0

C.‘top’ === 0

D.‘a’ == a

E.123 == ‘123’

答案解析:B 和 E 正確。選項 B 中,在比較時,字元串 top 等同於數字 0。==操作符不比對數據類型,所以將返回 true。答案 E 中,字元串 123 等同於數字 123,比較將返回 true。

14.如果用+操作符把一個字元串和一個整型數字相加,結果將怎樣?

A.解釋器輸出一個類型錯誤

B.字元串將被轉換成數字,再與整型數字相加

C.字元串將被丟棄,只保留整型數字

D.字元串和整型數字將連接成一個新字元串

E.整形數字將被丟棄,而保留字元串

答案解析:字元串將被轉換成數字(如果無法發生轉換就是 0),然後與整型數字相加。答案是 B。

15.考慮如下腳本。假設 http://www.php.net 能被訪問,腳本將輸出什麼?

$s = file_get_contents ("http://www.php.net");

strip_tags ($s, array ('p'));

echo count ($s);

?>

A.www.php.net 的主頁的字元數

B.剔除標簽後的 www.php.net 主頁的字元數

C.1

D.0

E.剔除以外的標簽後的 www.php.net 主頁的字元數

答案解析:代碼的本意是剔除 www.php.net 主頁上除了 p 以外的的所有 HTML 標簽。可實際上,在代碼的最後一行使用了 count 函數,它統計變數中的元素數量,而不是字元串中的字元數。由於字元

串是標量,對字元串使用 count 函數將永遠返回 1。答案是 C。

16.哪個函數能不區分大小寫得對兩個字元串進行二進制比對?

A.strcmp()

B.stricmp()

C.strcasecmp()

D.stristr()

E.以上都不能

答案解析:題目其實就是在描述 strcasecmp 函數的作用,因此答案是 C。

17.以下哪些函數能把字元串里存儲的二進制數據轉化成十六進制?(雙選)

A.encode_hex()

B.pack()

C.hex2bin()

D.bin2hex()

E.printf()

答案解析:正確答案是 B 和 D。pack 函數能對二進制數據進行復雜的格式化,包括將字元串中的字元轉化成十六進製表示。bin2hex 函數也有同樣的轉化功能。注意,printf()能將整數轉化成十六進

制數,但無法轉化字元串。

18.哪個函數能用來確保一個字元串的字元數總是大於一個指定值?

答案解析:這是在說 str_pad 函數,它可以把字元串填充到指定長度。

19.以下腳本輸出什麼?

echo wordwrap ($a, 1, "c", false);

?>

答案解析:腳本將輸出 ablecostscindy。wordwrap 函數通常用來把字元串切割成指定長度。然而在本題中,長度被設置為 1,因此函數將從空格處切割(第四個參數被設置為 false,因此函數不會從

單詞的中間進行切割)。填充字元串是 c,等於把每個空格都換成了 c。

20.以下腳本輸出什麼?

echo substr_replace ($x, 'x', 1, 2);

?>

A.x

B.axle

C.axxle

D.applex

E.xapple

答案解析:腳本將輸出 ablecostscindy。wordwrap 函數通常用來把字元串切割成指定長度。然而在本題中,長度被設置為 1,因此函數將從空格處切割(第四個參數被設置為 false,因此函數不會從

單詞的中間進行切割)。填充字元串是 c,等於把每個空格都換成了 c。

;

㈤ php 處理json字元串的問題

$json='{"a":1,"b":2,"c":3,"d":4,"e":5}';
//已數組形式返回
$a=json_decode($json,TRUE);
//為對應鍵值的變數賦值
foreach($aas$k=>$v){
eval('$'.$k.'='.$v.';');
}
//實測有效
echo$a;
echo'<p>';
echo$b;
echo'<p>';
echo$c;
echo'<p>';
echo$d;
echo'<p>';
echo$e;
echo'<p>';

上面的方法也是正確的,怎麼取捨看你的程序需求

㈥ php中關於字元串運算的問題

PHP在運算時自動根據參加運算的量和運算符轉換為一致類型,你的例子中$str會轉換為int類型加。

當然,對於+1計算會自動轉換為整數,如果是+1.0會轉換為浮點數,同樣的,對數值類型進行.運算也會轉換為字元串,例如:
'abc' . 123
的結果會是字元串的abc123

㈦ 解釋下下面PHP方法

microtime()是時間戳的微秒數;

(double)microtime()是將值雙精度處理;

(double)microtime()* 1000000是六位數字;

mt_srand((double)microtime()* 1000000)是將六位數字作為種子,生成隨機數(自 PHP 4.2.0 起,不再需要用mt_srand() 函數給隨機數發生器播種)

mt_rand(1, 99999)是從1到99999之間生成隨機數

str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT)隨機數如果不足5位,則左邊補0

"P".date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT)結果的形式是P+20180105(日期)+00285(隨機五位數)

㈧ php數組包含數字字元串嗎

本文小編為大家詳細介紹「php數組的元素可不可以是數字」,內容詳細,步驟清晰,細節處理妥當,希望這篇「php數組的元素可不可以是數字」文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

php數組的元素可以是數字。因為PHP是弱數據類型的編程語言,所以PHP中的數組可以存儲任櫻前高意多個、任意類型的數據,即數組元素的類型沒有限制,可以是數字(整數和浮點數)、字元串、布爾值、數組、Object對象等類型。



本教程操作環境:windows7系統、PHP8.1版、DELL G3電腦

php數組的元素可以是數字。

數組是 PHP 中最重要的數據類型之一,在 PHP 中的應用非常廣泛。因為 PHP 是弱數據類型的編程語言,所以 PHP 中的數組變數可以存儲任意多個、任意類型的數據,並且可以實現其他強數據類型中的堆、棧、隊列等數據結構的功能。

簡單來說,PHP數組元素的類型沒有限制,可以是數字、字元串、布爾值、數組、Object對象等類型。

示例1:索引數組

<?php
header("Content-type:text/html;charset=utf-8");
$arr= array(1,2,"3",4,0.5,"hello",TRUE,3.14);
var_mp($arr);
?>


說明:索引數組的下標(鍵名)由數字組成,默認從 0 開始,每個數字對應一個數組元素在數組中的位置,不需要特別指定,PHP 會自動為索引數組的鍵名賦一個整數值,然後從這個值開始自動遞增。

示例2:關聯數組

<?php
header("Content-type:text/html;charset=utf-8");
$arr=array(1=>1,"a"=>3.5,2=>2,"b"=>0,"c"=>"blue");
var_mp($arr);
?>


說明:關聯數組的下標(鍵名)由數值和字元串混合的形式組成,如果一個數組中有一個鍵名不是數字,那麼這個數組就是關聯數組。

php中的數字

在php中,數字可分為integer(整型)和float(浮點型)

類型 功能
integer(整型) 整型包含所有的整數,可以是正數也可以是負數
float(浮點型) 浮點型也是用來表示數字的,與整型不同除了可以表示整數外它還可以用來表示小數和指數
1)整型

在 PHP 中,整型變數稱為 integer 或 int 類型,用來表示一個整數,整型的規則如下所示:

整型必須至少有一個數字(0~9);

整型不能包含逗號或空格;

整型不能包含小數點;

整型可以是正數或負數。

整型的取值范圍必須介於 -2E31 到 2E31 之間,可以用三種格式來表示,即十進制、十六進制(以 0x 為前綴)和八進制(以 0 為前綴)。

<?php
$x = 5985; // 定義一個整型數據類型的變數
var_mp($x); // 輸出此變數
$x = -345;
var_mp($x);
$x = 0x8C; //十六進制數字
var_mp($x);
$x = 047; //八進制數字
var_mp($x);
?>


注意,在 PHP7 版本中,含有十六進制字元的字元串不再被視為數字,而是當作普通的字元串。

2)浮點型

浮點型在 PHP 中被稱為 float 類型,也可稱為實數,可以用來存儲悔鬧整數和小數,有效的取值范圍是 1.8E-308 到 1.8E+308 之間。浮點數的精確度比整型數據類型要高。

<?php
$num1 = 10.365;
$num2 = 2.4e3;
$num3 = 8E-5;
var_mp($num1, $num2, $num3);
?>


讀到這里,這篇「php數組的元素可不可以是數字」文章已經介紹完畢,想要掌握這篇文章的知脊尺識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速雲行業資訊頻道。

閱讀全文

與php填充字元串相關的資料

熱點內容
對弈下象棋的app哪裡好 瀏覽:705
有什麼食譜app推薦 瀏覽:469
python實現動態口令 瀏覽:823
我的世界電腦伺服器地址怎麼添加 瀏覽:850
傳奇地圖怎麼加密到pak 瀏覽:977
linux刪除mysql用戶 瀏覽:755
圖案設計pdf 瀏覽:584
pdf編輯器在線 瀏覽:471
華為雲雲耀伺服器如何關機 瀏覽:994
數字加密的歷史 瀏覽:613
宏傑文件夾打不開 瀏覽:819
施工日記app哪個好 瀏覽:566
什麼是壓縮機的排氣量 瀏覽:538
在哪個app可以預約一科考試 瀏覽:634
易語言vmp加殼源碼 瀏覽:513
閱讀前端框架源碼 瀏覽:14
我的世界命令方塊傳送指令 瀏覽:545
不能用start命令打開xp 瀏覽:925
text命令 瀏覽:30
為什麼appstore經常下架游戲 瀏覽:91