【數組基礎】【數組遍歷】【超全局數組】【數組功能】【數組函數】 ...
PHP數組
數組是特殊的變數,它可以同時保存一個以上的值。
***關鍵詞:數組基礎、數組遍歷、超全局數組、數組功能、數組函數。
下麵來和大家分享一下有關PHP的數組基礎知識,希望對你PHP的學習有所幫助~
一、PHP數組基礎部分 |
一PHP數組的分類
按照下標的不同,PHP數組分為關聯數組和索引數組;
索引數組:下標從0開始,依次增長
關聯數組:下標為字元串格式,每個下標字元串與數組的值一一關聯對應(類似對象的鍵值對)
代碼演示:
1 $arr1 = array(1,2,3,4,5,6,7);//索引數組 2 var_dump($arr1); 3 4 $arr2 = array("one"=>1,"two"=>2,"three"=>3);//關聯數組 5 var_dump($arr2); 6 7 $arr3 = array(1,"one"=>2,3,5=>4,5,6,"10.0"=>7,"08"=>8,"08"=>10,"hahah"=>9); 8 var_dump($arr3);
二關於關聯數組和索引數組
1、數組中,可以同時存在索引數組與關聯數組。
array(1,2,3,"one"=>4);
2、數組中,所有的索引數組,如果不加指定,會去掉關聯項,預設增長(即,關聯數組不占索引位);
array(1,2,"one"=>3,4,5);//1,2,4,5的索引--->0/1/2/3
3、如果,關聯數組的key,是純十進位整數字元串,
則會將此數字轉為索引數組的索引值;("10.0"/"08"等格式,仍然是關聯數組,不轉為索引)
array(1,2,"one"=>3,"9"=>4,"010"=>5);//1,2,4的索引--->0/1/9
4、如果,手動指定關聯數組的key,索引數組的下標,如果與前面已有的key或下標重覆,則後制定的值會覆蓋之前的值;
array(1,"one"=>2,0=>5,"one"=>6);--->列印數組,0=>5,"one"=>6
5、如果手動指定索引數組下標,則後續自增長下標,會按照之前下標最大值,依次增長。
array(1,2,7=>3,4);--->1,2,3,4的下標--->0/1/7/8
三數組的聲明方式
1、直接賦值聲明
$arr[] = 1;
$arr[] = 1;
$arr[] = 1;
$arr[] = 1;
$arr[] = 1;
var_dump($arr);
2、[]字面量聲明(PHP5.4版本之後能用)
$arr = [1,2,3,4,"one"=>5,6];
var_dump($arr);
3、Array()聲明 沒有new關鍵字
$arr = array(1,2,3,4,5);
var_dump($arr);
四數組元素的讀取
PHP中,數組支持[]和{}讀取下標。
五多維數組
①數組的一個值,依然是一個數組,我們稱這種數組為多維數組;
②多維數組,不要求所有的項都是數組,可以是數組與普通值的混合;
③多維數組,也不要求每個子數組的個數限制,可以是任意的長度。
使用多維數組,一定要註意,數組中分隔用逗號!
原則上,多維數組一般不超過3層使用!
三維數組代碼演示如下:
1 $H51701 = array( 2 "group1"=>array( 3 array("name"=>"張三","age"=>14,"sex"=>"男"), 4 array("name"=>"李四","age"=>15,"sex"=>"男"), 5 array("name"=>"王二","age"=>13,"sex"=>"男") 6 ), 7 "group2"=>array( 8 array("name"=>"張三","age"=>15,"sex"=>"男"), 9 array("name"=>"李四","age"=>15,"sex"=>"男"), 10 array("name"=>"王二","age"=>14,"sex"=>"男") 11 ), 12 "group3"=>array( 13 array("name"=>"張三","age"=>14,"sex"=>"男"), 14 array("name"=>"李四","age"=>18,"sex"=>"男"), 15 array("name"=>"王二","age"=>24,"sex"=>"男") 16 ), 17 ); 18 var_dump($H51701);
二、數組遍歷 |
1、使用for迴圈遍曆數組
count($arr);用於統計數組元素的個數
for迴圈只能用於遍歷,純索引數組!
如果存在關聯數組,count統計時會統計兩種數組的總個數,使用for迴圈遍歷混合數組,導致數組越界!
代碼如下:
1 $arr = array(1,2,3,"one"=>4,5,6,7); 2 $num = count($arr); 3 echo"數組元素的個數{$num}<br/>"; 4 for($i=0;$i<$num;$i++){ 5 echo "{$i}==>{$arr[$i]}<br/>"; 6 }
2、forEach迴圈遍曆數組
foreach可以遍歷任何類型的數組!
代碼如下:
1 $arr = array(1,2,3,"one"=>4,5,6,7); 2 foreach($arr as $key=>$item){ 3 echo "{$key}==>{$item}<br/>"; 4 }
下麵我們來做一個數組遍歷的小練習~看代碼~
1 $arr = array( 2 "group1"=>array( 3 array("name"=>"張三","age"=>14,"sex"=>"男"), 4 array("name"=>"李四","age"=>12,"sex"=>"男"), 5 array("name"=>"王二","age"=>18,"sex"=>"男") 6 ), 7 "group2"=>array( 8 array("name"=>"張三","age"=>14,"sex"=>"男"), 9 array("name"=>"李四","age"=>16,"sex"=>"男"), 10 array("name"=>"王二","age"=>19,"sex"=>"男") 11 ), 12 "group3"=>array( 13 array("name"=>"張三","age"=>14,"sex"=>"男"), 14 array("name"=>"李四","age"=>12,"sex"=>"男"), 15 array("name"=>"王二","age"=>13,"sex"=>"男") 16 ), 17 ); 18 19 foreach($arr as $key=>$value){ 20 echo "{$key}<br/>"; 21 foreach($value as $key1=>$value1){ 22 echo "第".($key1+1)."個同學<br/>"; 23 foreach($value1 as $key2=>$value2){ 24 echo "{$key2}==>{$value2}<br/>"; 25 } 26 echo"<br/>"; 27 } 28 echo"----------------------<br/>"; 29 }
3、使用list(),each(),while()遍曆數組
list():用於將數組的每一個值,賦值給list函數的每一個參數。(list函數的參數,必須<=數組的元素個數);
eg:list($a,$b,$c) = [1,2,3]; --->$a=1; $b=2; $c=3;
註意:
①list()在解析數組時,只解析索引數組;
②list可以通過空參數,選擇性的解析數組的值;
list($a,,$b)=[1,2,3];-->$a=1;$b=3;
each():用於返回數組當前指針所在位的鍵值對!並將指針後移一位;
返回值:如果指針有下一位,返回一個數組。包含一個索引數組(0-鍵,1-值)和一個關聯數組("key"-鍵,"value"-值);
如果指針沒有下一位,返回false。
4、使用list()/each()/while()配合遍曆數組※※※
1 while(list($key,$value) = each($arr)){ 2 echo "{$key}-->{$value}<br>"; 3 } 4 reset($arr);
!!!數組使用each()遍歷完一遍後,指針使用處於最後一位的下一位,即再用each(),始終返回false;
如果還需使用,需用reset($arr);函數,重置數組指針。
$arr = [1,2,3,4];
list($a,$b,$c,$d) = $arr;
echo "a-->{$a}<br/>";
echo "b-->{$b}<br/>";
echo "c-->{$c}<br/>";
echo "d-->{$d}<br/>";
while($a = each($arr))
①each($arr)返回數組或false;
②把數組或false賦值給$a;
③while判斷$a如果是數組,繼續執行下一位;
如果$a是false,終止迴圈。
1 while($a = each($arr)){ 2 echo "{$a[0]}-->{$a[1]}<br>"; 3 echo "{$a['key']}-->{$a['value']}<br>"; 4 } 5 6 while(true){ 7 $a = each($arr); 8 if($a){ 9 echo "{$a[0]}-->{$a[1]}<br>"; 10 echo "{$a['key']}-->{$a['value']}<br>"; 11 }else{ 12 break; 13 } 14 } 15 16 while(list($key,$value) = each($arr)){ 17 echo "{$key}-->{$value}<br>"; 18 } 19 reset($arr);
5、使用數組指針遍曆數組
①next:將數組指針,後移一位,並返回後一位的值,沒有返回false
②prev:將數組指針,前移一位,並返回前一位的值,沒有返回false
③end:將數組指針,移至最後一位,返回最後一位的值,空數組返回false
④reset:將數組指針,恢復到第一位,並返回第一位的值,空數組返回false
⑤key:返回當前指針所在位的鍵;
⑥current:返回當前指針所在位的鍵;
1 $arr = [1,2,3,4,"one"=>5]; 2 while(true){ 3 echo key($arr); 4 echo "--"; 5 echo current($arr); 6 echo "<br>"; 7 if(!next($arr)){ 8 break; 9 } 10 } 11 reset($arr); 12 do{ 13 echo key($arr); 14 echo "--"; 15 echo current($arr); 16 echo "<br>"; 17 }while(next($arr)); 18 reset($arr);
三、超全局數組 |
超全局數組,超全局變數,預定義數組,預定義變數——說的都是它。
PHP給我們提供了一組包含強大功能的超全局數組,可以在任何地方,任何作用域不需聲明,直接使用!不受任何作用域限制。
PHP超全局數組
1、伺服器變數: $_SERVER
2、環境變數:$_ENV
3、HTTP GET變數:$_GET
4、HHTP POST變數:$_POST
5、request變數:$_REQUEST
6、HTTP文件上傳變數:$_FILES
7、HTTP Cookies:$_COOKIE
8、Session變數:$_SESSION
9、Global變數:$GLOBALS
1、伺服器變數: $_SERVER
var_dump($_SERVER);
echo ($_SERVER{'HTTP_USER_AGENT'});
2、環境變數:$_ENV
將系統環境變數,轉變為PHP中的數組,就是$_ENV;
PHP預設是關閉此全局數組的。如果需要使用,
需修改php.ini文件中的variables_order = "GPSC",
改為variables_order = "EGPSC";
但是,修改後會有系統性能損失,港方並不推薦使用。
可以使用getenv()函數取代全局變數,取出每個系統環境變數的值。
phpinof();函數,包含了有關PHP的各種信息,其實environment板塊就是系統環境的變數,可以使用getevn()函數取出其中的值;
3、HTTP GET變數:$_GET
獲取前臺通過get方式提交的數據
1 if(isset($_GET["sybmit"]&&isset($_GET["pwd"]))){ 2 if($_GET["username"]=="111"&&$_GET["pwd"]=="111"){ 3 echo "Get登錄成功!"; 4 }else{ 5 echo "Get登錄失敗!"; 6 } 7 }
4、HHTP POST變數:$_POST
獲取前臺通過post方式提交的數據
1 if(isset($_POST["sybmit"])){ 2 if($_POST["username"]=="111"&&$_POST["pwd"]=="111"){ 3 echo "POST登錄成功!"; 4 }else{ 5 echo "POST登錄失敗!"; 6 } 7 }
5、request變數:$_REQUEST
包含了$_GET,$_POST和$_COOKIE的數組
由於request同時包含get和post,可能導致get與post的鍵衝突,並且頻率也不高。所以,並不使用request。
var_dump($_REQUEST);
6、HTTP文件上傳變數:$_FILES
通過HTTP POST方式上傳到當前腳本的項目的數組。
var_dump($_FILES);
7、HTTP Cookies:$_COOKIE
取到頁面中的Cookie信息
1 setcookie("cookie","haha");
2 $_COOKIE["hehe"] = "hehe";
3 var_dump($_COOKIE);
8、Session變數:$_SESSION
取到保存在Session中的信息。
session_start();
$_SESSION["haha"] = "haha";
var_dump($_SESSION);*/
9、Global變數:$GLOBALS
$GLOBALS包含了上述8個全局數組,可以通過$GLOBALS["_SERVER"]取到$_SERVER
還可以通過給$GLOBALS數組追加下標。創建全局變數,可以在函數里函數外隨意訪問:$GLOBALS["name"] = "zhangsan";
var_dump($GLOBALS["_SERVER"]);
四、數組功能 |
1、返回數組所有的值,返回數組
var_dump(array_values($arr));
2、返回數組所有的鍵,返回數組
var_dump(array_keys($arr));
3、檢測數組中是否包含某個值。返回真、假
參數:需要查詢的值,數組,true(===)/false(===) 預設
var_dump(in_array("8",$arr,true));
4、交換數組中的鍵和值,返回新數組
var_dump(array_flip("8",$arr));
5、反轉數組,返回新數組
參數:需要反轉的數組
true:保留原有索引數組的下標與值的匹配。
false:只反轉值,鍵不反轉,預設
無論true/false,都不會影響關聯數組,關聯數組鍵,值永遠是一對。
var_dump(array_reverse($arr,true));
6、統計數組元素個數
count($arr);
7、統計數組中,所有值出現的次數,返回一個新數組
新數組格式:鍵-->原數組的值(去重後的值)
值-->原數組對應的值出現的次數。
var_dump(array_count_values($arr));
8、移出數組中重覆的值!
var_dump(array_unique($arr));
9、過濾數組中的每一個值:
①不傳回調函數:過濾掉所有空值(0/""/null/false/"0"/[])
②傳回調函數:需要給回調函數傳遞一個參數,判斷參數是否符合要求,如果符合,return true;否則,return false。
1 var_dump(array_filter($arr,function($num){ 2 if($num>4){ 3 return true; 4 }else{ 5 return false; 6 } 7 }));
通過回調函數,對數組的每一個值,進行處理操作。(直接修改原數組,並返回bool類型的是否成功)
執行時,會給回調函數傳遞兩個參數,分別是數組的value,key,然後可以在毀掉函數中,對值和鍵進行處理。
但是,牽扯到修改值的時候,必須要傳遞地址&!!!!
$fruits = array("d" => "lemon","a" => "orange","b" => "banana","c" => "apple");
1 var_dump(array_walk($fruits,function(&$item,$key){ 2 echo "{$key}-->{$item}<br>"; 3 $item .= $key; 4 })); 5 var_dump($fruits);
將數組的每個值交由回調函數進行映射處理
array_map():第一個參數,是一個回調函數。第二個參數起,是>=1個數組。
有幾個數組,可以給回調函數傳幾個參數,,表示每個數組的一個value;
可以對value進行處理,處理完以後通過return返回,那麼新數組的對應的值就是你return回去的值。
【array_map與array_walk的異同】
相同點:都能遍曆數組,通過回調函數,重新處理數組的每一個值;
不同點:
①walk只能傳一個數組,回調函數接收這個數組的值和鍵;
map可以傳多個數組,回調函數接收每個數組的值;
②walk直接修改原數組,而map不修改原數組,將新數組返回;
③walk給回調函數傳遞一個其餘參數,map只能傳數組的值;
④處理方式上,walk如果需要改掉原數組的值,需在回調函數中傳遞地址,直接修改變數的值;
而map,是通過將新的值,用return返回,即可修改新數組的值。
$a = [1,2,3,4,5];
$b = [1,2,3,4,5];
1 var_dump(array_walk($fruits,function(&$item,$key){ 2 echo "{$key}-->{$item}<br>"; 3 $item .= $key; 4 })); 5 var_dump($fruits);
五、數組函數 |
sort -- 對數組排序(升序)
var_dump(sort($arr));
rsort--對數組逆向排序(降序)
usort--使用用戶自定義的比較函數對數組中的值進行排序
asort--對數組進行排序並保持索引關係(關聯數組排序)
arsort--對數組進行逆向排序並保持索引關係
uasort--用戶自定義的比較函數對數組進行排序並保持索引關聯
ksort--對數組按照鍵名排序
krsort--對數組按照鍵名逆向排序
uksort--使用用戶自定義的比較函數對數組中的鍵名進行排序
natsort--用“自然排序”演算法對數組排序
natcasesort--用“自然排序”演算法對數組不區分大小寫字母排序
array_multisort -- 對多個數組或多維數組進行排序
第一個參數:第一個數組,必選
第二個參數:SORT_DESC;SORT_ASC(升序降序);
第三個參數:SORT_STRING/SORT_NUMERIC(按照字元串還是數字排序)
再之後是多個數組
排序規則:先排第一個數組,後面的數組會根據和第一個數組的對應關係,一列一列的排序;
如果多個數組多個數組排序,排序的數組長度要相等,否則報警告;
array_slice($array, $offset)
第一個參數:數組,必須;
第二個參數:從第幾位開始截,負數表示從右往左數(按照數組的順序ps:包括關聯數組,而非下標)
第三個參數:截取的長度,可選,預設截取到最後
第四個參數:bool類型的參數,預設為false,索引重新排序,true保持索引關聯
$arr1 = array_slice($arr, 2,5,TRUE);
array_splice($offset)
返回值:數組(被刪掉的部分)
參數:
1、數組的地址,會修改原數組
2、從第幾位開始刪
3、刪除的長度,不填預設到結尾
4、不填,預設為刪除,填,用填的部分替換刪掉的部分;
$arr1 = array_splice($arr, 2,5,[1,2,3,4]);
array_combine($keys, $values);創建一個數組,用一個數組的值作為鍵名,另一個數組的值作為值;
array_combine($keys'作為鍵的數組', $values'作為值的數組');
兩個數組的長度必須一致,否則報警告
array_merge($array1);合併一個或多個數組
合併多個數組,將後面的數組拼接在前面數組的後面
如果多個數組中存在多個同名的關聯鍵,則後面的會覆蓋前面的
array_intersect($array1, $array2);兩個數組取交集
多個數組取交集,結果會保留第一個數組的鍵值關聯匹配
array_diff($array1, $array2);多個數組取差集;
取出多個數組中,在第一個數組中包含,但是在其他數組中不包含的值,保留第一個數組的鍵值關聯;
array_pop();
刪除數組最後一個值;返回刪除的值;
array_push($var);
數組的最後插入一個或多個值;返回處理之後元素的個數
array_shift();
刪除數組第一個值;返回刪除的值;
array_unshift($var);
數組的開頭插入一個或多個值;返回處理之後元素的個數
array_rand($input);隨機抽取數組中的一個到多個鍵名!第二個參數為空,表示抽一個,傳入數字n表示抽n個
shuffle();將函數打亂重新排序
好啦~~~今天的內容先分享到這裡,小女子小菜鳥一隻,還請各位園友多多指教·喜歡就點個贊吧~感謝支持!
作者:夕照希望
出處:http://www.cnblogs.com/hope666/