這一次,本K帶大家來看一下關於PHP中數組、字串的一些注意事項和函數(方法)。
一、PHP中的數組
(一)PHP中的數組簡介
數群組類型是PHP兩種複合資料型別之一。根據下標的不同,可以將PHP中的數組分成關聯陣列和索引數組:前者指下標為字串格式,每個下標字串與數組的值一一對應;後者下標為數字,與JS中的數組下標相同,但在一些規則上與JS相差甚遠(後述)。
關於關聯陣列與索引數組,以及其與JS中數組的某些不同,有如下五條大致可以概括:
1、數組中,可以同時存在索引數組和關聯陣列
array(1,2,3,"four"=>4);
2、數組中,所有的索引數組,如果不加指定,會去掉關聯項,預設增長(即關聯陣列不佔索引位)
array(1,2,3,"four"=>4,5,6); --> 1,2,3,5,6的索引分別為0 1 2 3 4
3、如果關聯陣列的key,是純十進位整數字串,則會將此數字轉為索引數組的索引值
array(1,2,3,"9"=>4); --> 1 2 3 4 的索引分別為 0 1 2 9
4、如果手動指定關聯陣列的key,索引數組的下標,如果與前面已有的key或下標重複,則後指定的值會覆蓋之前的值
array(1,2,"one"=>5,"one"=>6) --> 列印數組為 1 2 "one"=>6
5、如果手動指定索引數組下標,則後續自增長下標,會按照之前下標最大值,依次增長
array(1,2,3,"9"=>4,5); --> 1 2 3 4 5 的索引分別為 0 1 2 9 10
其次,是PHP中數組的聲明方式。PHP中的數組聲明方式有三種(如下列代碼),分別是直接賦值聲明、array聲明、[]聲明。需要注意的是,第三種聲明方式實在PHP5.4版本以後才加入進來的,使用時一定要先核對好所使用的PHP版本。
$arr[] = 4; // 直接賦值聲明$arr = [1,2,3,4]; //[]聲明 $arr = array(1,2,3,4); //array聲明
PHP中數組的遍曆主要有4種方式,分別是使用for迴圈遍曆數組、foreach迴圈遍曆數組、使用list() each() while遍曆數組、使用數組指標遍曆數組。詳細方法K會在另一篇博文中講述,敬請期待。
最後,是PHP數組涉及到的幾個超全域數組。所謂超全域,就是可以在任何地方、任何範圍不用聲明,直接可以使用的幾個系統數組,其存在是因為PHP範圍中變數範圍限制(PHP這點真的坑)。下面一段筆記代碼,給大家做個參考。
/* * 【超 全域 數組】 * 超全域數組、超全域變數、預定義數組、預定義變數 --> 說的都是它 * PHP給我們提供了一組包含強大功能的超全域數組。可以在任何地方、任何範圍不需聲明,直接使用!!不受任何範圍限制。 * 1 伺服器變數: $_SERVER * 返回包含瀏覽器頭資訊,路徑,指令碼以及伺服器系統等各種資訊! 2 環境變數:$_ENV * 將系統內容變數,轉變為PHP中的數組。就是$_ENV; * PHP預設是關閉此全域數組的,如果需要使用,需修改php.ini溫江中的variable_order="GPSC",改為EGPSC; * 但是,修改後會有系統效能損失,官方並不推薦使用。 * 可以使用getenv()函數取代全域變數,取出每個系統內容變數的值。 * phpinfo();函數,包含了有關PHP的各種資訊,其中ENVIROMENT板塊就是系統內容變數,可以使用getevn();取出其中的每一個值。 !!!!3 HTTP GET變數:$_GET * 擷取前台通過get方式提交的資料 !!!!4 HHTP POST變數:$_POST * 擷取前台通過post方式提交的資料 5 request變數:$_REQUEST * 包括了$_GET/$_POST/$_COOKIE三者 * 由於可能同時包含get post,可能導致鍵衝突,並且效率也不高,所以不常使用!!! 6 HTTP檔案上傳變數:$_FILES * 通過HTTP POST方式上傳到當前指令碼的項目的數組 7 HTTP Cookies:$_COOKIE * 取到頁面中的cookie資訊 !!!!8 Session變數:$_SESSION * 取到儲存在session中的資訊 9 Global變數:$GLOBALS * 包含上述8個全域數組 * 還可以給$GLOBALS數組追加下標,建立全域變數 */
(二)PHP數組中的常用函數
談到PHP中數組的函數,首先需要給各位從JS轉來的同志們提醒一下,PHP中的數組的“函數”這種叫法,跟JS中數組的“方法”是一樣的,都是指對數組進行處理的行為。函數這一部分因其內容的龐大性,首先推薦大家去看一下協助文檔()。下面是K記錄的關於PHP中數組函數的一些筆記,大家可以自行粘貼至編輯器上取消/設定注釋來直接體驗。
$arr = ["one"=>1,4,7,"9"=>10,"haha"=>"haha",4]; // 返回數組所有的值(數組)var_dump(array_values($arr)); // 返回數組所有的鍵(數組)var_dump(array_keys($arr)); // 檢測數組中是否包含某個值(布爾)#參數# 需要查詢的值,數組[,true(===)/false(==)]var_dump(in_array(1,$arr,true)); // 交換數組中的鍵和值(數組)var_dump(array_flip($arr)); // 翻轉數組(數組)#參數# 數組[,true(保留原有索引數組的下標與值的匹配)/false(只翻轉值,鍵不保留)] #無論ture/false,都不會影響關聯陣列,關聯陣列總會保留#var_dump(array_reverse($arr,TRUE)); // 統計數組元素個數(整形)var_dump(count($arr,0)); // 統計數組中每個值出現的次數(數組)var_dump(array_count_values($arr));# !!不藉助系統函數實現array_count_values的功能/* 思路 * 1、有一個空數組:鍵 => 原數組的值 值 => 原數組每個值出現的次數 * 2、遍曆原數組,取出原數組中的每一個值 * 3、檢測取出的值是否在新數組中有一個同名的鍵 * 如果有:說明找到了與現在新取值相重複的值,那麼就把新數組中這個鍵對應的值+1; * 如果無:說明截止現在,還沒有與新取值重複的項,那麼就在新數組中建立一個同名的鍵,並把值為1。 *//* $arr1 = [0,2,5,7,9,4,2,1,5,7,1,0,1,1,1,1,1,2,4,4,5,7,7,4,3,2,4,6,8,5,3]; $arr2 = array(); foreach($arr1 as $key1=>$item1){ $isHas = FALSE; // 標誌變數!!! foreach($arr2 as $key2=>$item2){ if($key2==$item1){ $arr2[$item1]++; $isHas = TRUE; } } if(!$isHas) $arr2[$item1]=1; } var_dump($arr2);*/// 移除數組中重複的值// var_dump(array_unique($arr)); //過濾數組中的每一個值/* * 不傳回呼函數:過濾掉所有空值(0、""、null、false、"0"、[]) * 傳回呼函數:如下 */// var_dump(array_filter($arr,function($num){// if($num>4){// return TRUE;// }else{// return FALSE;// }// })); //通過回呼函數,對數組的每一個值,進行處理操作。 //執行時,會給回呼函數傳遞給兩個參數,分別是value key,然後可以在回呼函數中,對值和鍵進行處理! //但是,牽扯到修改值的時候,必須要傳遞地址!// var_dump(array_walk($funcname)) ///*將數組的每個值交由回呼函數進行映射處理 array_map():第一個參數是一個回呼函數,第二個參數起,是>=1個數組 有幾個數組,可以給回呼函數傳幾個參數,表示每一個數組的一個value; 可以對返回的value進行處理,處理完後通過return返回,那麼新數組對應的值就是return回去的值*/$a =[1,2,3,4,5];$b =[1,2,3,4];var_dump(array_map(function($value1,$value2){return $value1+$value2; }, $a,$b)); /* * array_walk與array_map的異同 * 兩者都能遍曆數組,通過回呼函數,重新處理數組的每一個值 * 不同點 * 1、walk只能傳一個數組,回呼函數接受這個數組的值和鍵;map可以傳多個數組,回呼函數接受每個數組的值 * 2、walk直接修改原數組;map不修改原數組,將新數組返回 * 3、walk可以給回呼函數傳遞一個其餘參數;map只能傳數組的值 * 4、處理方式上,walk如果需要改掉原數組的值,需在回呼函數中傳遞地址,直接修改變數的值;map是通過將新的值,用return返回,即可修改新數組的值。 *//* * 可以傳入第二個參數,控制以何排序。第二個參數傳1,表示按照數字排序;傳2,表示按照ascii排序;預設自動檢測 sort -- 對數組排序(升序) rsort -- 對數組逆向排序(降序) usort -- 使用使用者自訂的比較函數對數組中的值進行排序 * 下述三個函數常用於關聯陣列排序,用法同上 asort -- 對數組進行排序並保持索引關係(關聯陣列排序) arsort -- 對數組進行逆向排序並保持索引關係 uasort -- 使用者自訂的比較函數對數組進行排序並保持索引關聯 * ksort -- 對數組按照鍵名排序 krsort -- 對數組按照鍵名逆向排序 uksort -- 使用使用者自訂的比較函數對數組中的鍵名進行排序 * 自然排序,數字按照0-9,字母按照a-z進行排序 * 下面兩個函數,都會按照自然排序,並且排序時會保留索引值關聯 natsort -- 用“自然排序”演算法對數組排序 natcasesort -- 用“自然排序”演算法對數組不區分大小寫字母排序 * 對多個數組或多維陣列進行排序。 * 第一個參數:第一個數組必選,之後都是選擇性參數 * SORT_STRING/SORT_NUMBERIC按照字串還是數字 * SORT_DESC/SORT_ASC升降序排列 * * 定序,先排第一個數組,之後的數組,按照與第一個數組對應的關係,一列一列的移動 * * 如果對多個數組排序,需保持多個數組長度一致 array_multisort -- 對多個數組或多維陣列進行排序 */$arr = [1,2,3,4,9,7,6,10,22]; // sort($arr);// rsort($arr);// usort($arr,function($a,$b){#同JS中數組sort// return -$a+$b;// });// asort($arr);/*[不更改原數組] * array array_slice ( array $array , int $offset [, int $length = NULL [, bool $preserve_keys = false ]] ) * 參數一: 數組,必選 * 參數二:從第幾位開始截選,必選,負數表示從右邊第幾位(按照數組的預設順序,包含關聯和索引,而非下標) * 參數三:截取長度,可選,預設全選 * 參數四:表示是否保持索引值關聯,可選,預設索引重拍,為false,true為保持關聯 * */// $arr1 = array_slice($arr,3,2);// var_dump($arr1);/*[更改原數組] * array array_splice ( array &$input , int $offset [, int $length = 0 [, mixed $replacement ]] ) * 傳回值:被刪掉的數組 * 參數一:數組的地址,會改變原數組 * 參數二:從第幾位開始刪或替換 * 參數三:刪除或替換的長度 * 參數四:為空白表示刪除操作,傳入內容表示替換操作的新值 * */$arr2 = array_splice($arr,4); var_dump($arr2); /* * array_combine — 建立一個數組,用一個數組的值作為其鍵名,另一個數組的值作為其值 * 參數一:作為鍵的數組 * 參數二:作為值的數組 * 【兩個數組必須保持一致,否則警告,返回false】 */ /* 合并多個數組 * array array_merge ( array $array1 [, array $... ] ) * 合并多個數組,如果多個數組中,出現同名的關聯索引值,則後面的會覆蓋前面的 * */ /* 兩個數組取交集 * array array_intersect ( array $array1 , array $array2 [, array $ ... ] ) * 多個數組取交集,結果會保留第一個數組的索引值關聯比配 * */ /* 兩個數組去差集 * array array_diff ( array $array1 , array $array2 [, array $... ] ) * 取出多個數組中,在第一個數組中包含,但在其他數組中不包含的值,保留第一個數組的索引值關聯 * *//* * mixed array_pop ( array &$array )//刪除數組最後一個值,且返回這個值 * int array_push ( array &$array , mixed $var [, mixed $... ] )//數組的最後放入一到多個值,返回處理後數組的元素個數 * * mixed array_shift ( array &$array )//刪除數組第一個值,返回這個值 * int array_unshift ( array &$array , mixed $var [, mixed $... ] )//數組開頭放入一到多個值,返回處理之後的數組元素個數 * */ /* * mixed array_rand ( array $input [, int $num_req = 1 ] ) * 隨機抽取數組中的一到多個鍵名,二參數為空白,表示抽一個,傳入數子表示抽幾個 * */ /* * bool shuffle ( array &$array ) * 隨機打亂數組順序,直接修改原數組 * */
二、PHP中的字串
(一)PHP中的字串簡介
PHP中的字串是PHP四大基礎資料類型之一。
首先,來跟大家談一下PHP中字串的聲明方式。PHP中字串的聲明方式有三種,分別是通過""、''、標識符來進行聲明(詳述可見)。
其次,來跟大家以代碼筆記的形式著重說一下PHP中的各種輸出函數,筆記如下。
/* * 【各種輸出函數】 * 1、echo(純輸出,無返回):直接將內容輸出。可以是函數用法,也可以是指令用法;指令用法可以列印多個參數(逗號分割),函數用法只能列印一個參數。 * 2、print(基本不用):有函數寫法與指令寫法,但兩個都不能傳多個參數;有傳回值,傳回值總是為true。 * 3、print_r:列印數組和對象時,會用一定的格式顯示鍵和值的匹配。print_r列印數組時,會將數組指標移向最後一位。 * 4、var_dump:調試專用,顯示列印的類型、值等資訊,列印數組對象時,會縮排顯示索引值匹配,可以傳入多個參數,同時列印。 * 5、die:等同於exit,輸出資訊並且結束當前指令碼,可以不輸出資訊。 * 6、printf:列印內容並將變數進行格式化輸出。第一個參數:需要列印的字串內容,可以帶多個預留位置;第二到多個參數:與預留位置一一對應的變數。將後面的變數按照佔位符的格式要求依次輸出。 * 7、sprintf:使用同printf一樣,只不過不是輸出語句,而是將轉換之後的結果賦給一個變數。 * * [常用預留位置] %% 返回百分比符號 %b 位元 %c 依照ASCII值的字元 %d 帶符號十進位數 %e 可續計數法(如1.5e3) %u 無符號十進位數 %f或%F 浮點數 * --> 浮點數,預設保留六位小數 * 百分比符號和f之間可以插入數字表示精確程度。 * 數子的整數部分,表示精確的總寬度(整數+小數+小數點的總位元)。 * 數位小數部分表示保留幾位小數,進行四捨五入保留。 * 如果設定的寬度小於實際寬度,設定無效;如果設定的寬度大於實際寬度,左邊空格補位。 * 例如:$num = 10.12345; * printf("123%10.2f",$num); --> 10.12 * printf("123%010.2f",$num); --> 0000010.12 %o 八位元 %s 字串 %x或%X 十六進位數 */
(二)PHP中的常用函數
這裡,K的建議同上述數組是一樣的,同樣推薦大家首先閱讀協助文檔()。下面,K依然以代碼筆記的方式來給同志們介紹一下PHP中的常用函數。
/* * trim():刪除字串兩端的空格; * ltrim():刪除字串左端的空格; * rtrim():刪除字串右端的空格; * * 可以傳入第二個參數,表示刪除兩邊的相關字元。 * 從字串兩邊開始依次向內尋找第二個參數中出現的字元,只要發現就刪除,直到遇到第一個沒有出現的字元為止。 * 第二個字元常寫為 " \t\n\r\0\x0B",用於把各種空格相關的符號全都刪掉。 " " (ASCII 32 (0x20)),普通空格符。 "\t" (ASCII 9 (0x09)),定位字元。 "\n" (ASCII 10 (0x0A)),分行符號。 "\r" (ASCII 13 (0x0D)),斷行符號符。 "\0" (ASCII 0 (0x00)),空位元組符。 "\x0B" (ASCII 11 (0x0B)),垂直定位字元。 * * */$str = " 1 2 3 4 ";echo $str."\n"; echo ltrim($str)."\n";echo rtrim($str)."\n";echo trim($str)."\n";echo trim($str," 43")."\n"; /* * str_pad():將字串填充到指定長度; * 參數一:需要填充的字串,必選。 * 參數二:需要將字串填充到多長,必選。 * --->如果長度小於等於字串,則不會發生任何作用。 * 參數三:需要填充的文本,可選。 * --->預設用空格填充。 * 參數四:在字串的哪邊填充,可選。 * --->STR_PAD_BOTH:2 * --->STR_PAD_LEFT:0 * --->STR_PAD_RIGHT:1 * --->預設填充在右邊,如果選BOTH,則先從右邊開始填。 */ $str1 = "abcd"; echo str_pad($str1, 11,"12",STR_PAD_BOTH);echo str_pad($str1, 11,"12",STR_PAD_LEFT);echo str_pad($str1, 11,"12",STR_PAD_RIGHT); /* * strtolower():將所有字元轉成小寫 * strtoupper():將所有字元轉成大寫 * 上述兩個常用於不區分大小寫比對。 * * ucfirst():將字串首字母轉成大寫 * ucwords():將字串每一個詞首字母轉成大寫 * 後兩個只負責轉首字母,並不管其他字母的大小寫,如果只需要首字母大寫,通常配合strtolower()先將字母轉成小寫。 * */ /* 與HTML相關的函數: * 1、nl2br():將字串中的所有分行符號,轉為<br> * 2、htmlspecialchars():將HTML中的符號,轉換為實體內容。 * & :& ":" * ':' <:< * >:> 空格: * 轉成特殊字元後,無需再轉回,瀏覽器會自動解析為對應的標籤符號。 * 3.將字串中的所有HTML標籤刪除; * 參數1:需要過濾HTML標籤的字串; * 參數2:允許存在的HTML標籤:strip_tags($str,"<b><s><u>");只允許str這個字串中,存在<b><s><u>三個標籤,其他的全部刪除。 * * *//*【常用字串函數】 *1.strrev($str):將字串翻轉;"12345"-->"54321"; *2.strlen($str) :擷取字串字元個數,中文=三個字元 *mb_strlen($str):測量多位元組字串的長度,不論中英文均算一個長度; * {PHP中,很多字串函數,都有“mb_”的首碼,專門用於操作中文多位元組字串} *3.number_format():將一個浮點數,要求格式化為一個字串。 * 參數1:需要格式化的浮點數;必選。 * 參數2:保留幾位小數(四捨五入),預設不保留; * 參數3:小數點的顯示符號,預設為“.”; * 參數4:千位符的顯示符號:預設為“,”; *4.md5()/sha1():分別使用md5密碼編譯演算法以及sha1密碼編譯演算法對字串進行加密操作; * */$str="abcdefg哈哈哈";//一個漢字三個字元,一個字元一個字元翻轉;echo strrev($str);echo "<br/>";echo strlen($str);//字串長度16echo "<br/>";echo mb_strlen($str);//字串長度10echo "<br/>";echo number_format(12399.4567,4,"/","-");echo "<br/>";echo md5($str);echo "<br/>";echo sha1($str);echo "<br/>";echo sha1($str)=="527e8bad76c863b8903c51f7eedad006678d5f96";/*【字串的比較】 * 1.可以用比較子比較: * < > ==:如果兩邊都是字串,則比較首字母ASCII值, * 如果一邊是數字,則將字串轉為數字後再比對! *(重要) 2.strcmp("$str1","$str2"):比較兩個字串,區分大小寫;$str1>$str2-->1;$str1<$str2-->-1 $str1==$str2-->0 * 3.strncmp("$str1","$str2",int):比較方式與strcmp完全相同,只是多了一個必填的參數3,表示比較字串的長度,strncmp("Asdsa", "adsa",2),只比較前兩個字串的前兩個字元,如果比較漢字字串,一個漢字佔三個字元; *(重要) 4.strcasecmp ("$str1","$str2")比較全串字串,不區分大小寫; * 5.strnatcmp ("$str1","$str2"):將字串按照自然排序演算法進行排序比對; * strnatcmp ("10","2"):10>2,返回1; * strcmp("10", "2"):按照ASCII排序,1<2,返回-1;兩者相等時都=0,沒有任何差別。 *6. similar_text():返回兩個字串的相似性(兩個字串匹配字元的數目); * */ var_dump("a"<1);//"a"-->0; var_dump(strcmp("A", "a"));//-1 var_dump(strcmp("5", "5"));//0 var_dump(strncmp("Aaer", "Aacc",2));//0 var_dump(strncmp("張與", "張三",2));//0 var_dump(strcasecmp ("abcd","ABCD"));//0 var_dump(strnatcmp ("i10","i2"));//1 var_dump(similar_text("123","234"));//相同字元的長度 /*【常用字串操作函數】 * 1.explode():使用指定分隔字元,將字串分隔為數組; * 參數1:使用什麼分隔字元; * 參數2:需要分隔的字串; * 參數3:可選,將字串最多分為幾份,如果小於實際分數,則前n-1正常分,最後一個包含所有剩餘字串。 * 2.preg_split():通過一個Regex分隔字串,參數同上,第一個參數為Regex * 3.var_dump(str_split("hahah",2))--->["ha","ha","h"] * */ var_dump(explode(",","s,t,y,u",3)); var_dump(preg_split("/[\s,]+/","asdh adcjk, asjdi")); var_dump(str_split("hahah",2)); var_dump(mb_split("/[\w]{1}+/","sdsd,t,h"));//不好使 /* * 3.implode() : 將一個一維數組的值轉化為字串 * 4.substr():截取的字串; * 第一個參數:需要截取的字串; * 第二個參數:從哪個字元開始截取; * 第三個參數:需要截取的字串長度(預設截取到最後) * 5.mb_substr():用於截取中文字串,一個漢字=1個字元; *(重要)strstr():別名strchr():尋找並返回字串,是否包含某個子串,如果沒有找到返回false * 參數1:被尋找的字串,必選; * 參數2:需要尋找的子串,必選; * 參數3:true/false:返回子串前面的部分;返回子串及子串的所有字串,預設; * 6.stristr():功能同上,不區分大小寫, * 7.strrchr():取到需尋找字元在字串中最後一次出現的位置; * 第一個參數:被尋找的字串; * 第二個參數:需要尋找的字元,如果第二個參數是字串,則會使用字串的第一個字元,如果找到,返回該字串最後一次出現的位置,往後的部分。 * */ var_dump(implode("-",["a","b","c"]));//--->"a-b-c"; var_dump(substr("12345", 2,3)); var_dump(mb_substr("1234哈哈", 2,4)); var_dump(strstr("1234", "23",true)); var_dump(stristr("123哈哈4", "哈",true)); var_dump(strrchr("ABC123ABC456","AdBC")); /* 【字串尋找】 * 1.strpos() : 返回某個字串,尋找字串首次出現的位置; * 參數1:被尋找的字串; * 參數2:需要尋找的子串; * 參數3:從第幾個位置開始尋找; * 2.strrpos():返回某個字串,尋找字串最後出現的位置; * 3.stripos():不區分大小寫。返回第一次出現的位置; * 4.strripos():不區分大小寫。返回最後一次出現的位置; * */ var_dump(strpos("123AxhBzABC","ABC",1));//8 var_dump(strripos("123AxhBzABC","abc"));//8 var_dump(strrpos("123AxhBzABC","ABC",1));//8 var_dump(stripos("123AxhBzABC","abc",1));//8 /*【字串替換】 * str_replace():將字串中指定的部分用指定內容替換; * 參數1:被替換部分,可以是數組也可以是字串; * 參數2:新內容,可以是數組也可以是字串; * 參數3:原字串; * 共分為三類:1.第一個字串,第二個字串; * 2.第一個數組,第二個數組:將兩個數組一一進行映射替換; * ①兩個數組長度相等;將兩個數組一一進行映射替換; * ②第一個數組>第二個數組:第一個數組剩餘部分用“”替換(即刪了); * ③第一個數組<第二個數組:第二個數組剩餘的部分不用; * 3.第一個數組,第二個字串:數組的每一個都替換為字串; * */ var_dump(str_replace("e",",","jasbdheead")); var_dump(str_replace(["e","a","d"],",","jasbdheead")); var_dump(str_replace(["e","a","d"],[",","/",""],"jasbdheead")); var_dump(str_replace(["e","a","d"],[",","/"],"jasbdheead")); var_dump(str_replace(["e","a"],[",","/","-"],"jasbdheead")); var_dump(str_replace(["e","a","d"],"/","jasbdheead"));