PHP基礎入門(四)---PHP數組實用基礎知識

PHP數組

       數組是特殊的變量,它能夠同時保存一個以上的值。php

   ***關鍵詞:數組基礎、數組遍歷、超全局數組、數組功能、數組函數。算法

 

 

 

 

下面來和你們分享一下有關PHP的數組基礎知識,但願對你PHP的學習有所幫助~數組

 

1、PHP數組基礎部分

 

PHP數組的分類


按照下標的不一樣,PHP數組分爲關聯數組和索引數組;
索引數組:下標從0開始,依次增加
關聯數組:下標爲字符串格式,每一個下標字符串與數組的值一一關聯對應(相似對象的鍵值對)服務器

 

代碼演示:cookie

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);

 

關於關聯數組和索引數組


一、數組中,能夠同時存在索引數組與關聯數組。
array(1,2,3,"one"=>4); session

 

二、數組中,全部的索引數組,若是不加指定,會去掉關聯項,默認增加(即,關聯數組不佔索引位);
array(1,2,"one"=>3,4,5);//1,2,4,5的索引--->0/1/2/3app

 

三、若是,關聯數組的key,是純十進制整數字符串,
則會將此數字轉爲索引數組的索引值;("10.0"/"08"等格式,仍然是關聯數組,不轉爲索引)
array(1,2,"one"=>3,"9"=>4,"010"=>5);//1,2,4的索引--->0/1/9ide

 

四、若是,手動指定關聯數組的key,索引數組的下標,若是與前面已有的key或下標重複,則後製定的值會覆蓋以前的值;
array(1,"one"=>2,0=>5,"one"=>6);--->打印數組,0=>5,"one"=>6函數

 

五、若是手動指定索引數組下標,則後續自增加下標,會按照以前下標最大值,依次增加。
array(1,2,7=>3,4);--->1,2,3,4的下標--->0/1/7/8post

 

數組的聲明方式


一、直接賦值聲明
$arr[] = 1;
$arr[] = 1;
$arr[] = 1;
$arr[] = 1;
$arr[] = 1;
var_dump($arr);

二、[]字面量聲明(PHP5.4版本以後能用)
$arr = [1,2,3,4,"one"=>5,6];
var_dump($arr);

三、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);

 

 

2、數組遍歷

 

一、使用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 }

 

二、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 }

 

三、使用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。

四、使用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);

 

五、使用數組指針遍歷數組

①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);

 

3、超全局數組


超全局數組,超全局變量,預約義數組,預約義變量——說的都是它。

PHP給咱們提供了一組包含強大功能的超全局數組,能夠在任何地方,任何做用域不需聲明,直接使用!不受任何做用域限制。

PHP超全局數組

       一、服務器變量: $_SERVER
  二、環境變量:$_ENV
  三、HTTP GET變量:$_GET
  四、HHTP POST變量:$_POST
  五、request變量:$_REQUEST
  六、HTTP文件上傳變量:$_FILES
  七、HTTP Cookies:$_COOKIE
  八、Session變量:$_SESSION
  九、Global變量:$GLOBALS

 

一、服務器變量: $_SERVER
var_dump($_SERVER);
echo ($_SERVER{'HTTP_USER_AGENT'});

二、環境變量:$_ENV
將系統環境變量,轉變爲PHP中的數組,就是$_ENV;

PHP默認是關閉此全局數組的。若是須要使用,
需修改php.ini文件中的variables_order = "GPSC",
改成variables_order = "EGPSC";

可是,修改後會有系統性能損失,港方並不推薦使用。
可使用getenv()函數取代全局變量,取出每一個系統環境變量的值。

phpinof();函數,包含了有關PHP的各類信息,其實environment板塊就是系統環境的變量,可使用getevn()函數取出其中的值;

三、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 }

 

四、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 }

 

五、request變量:$_REQUEST
包含了$_GET,$_POST和$_COOKIE的數組
因爲request同時包含get和post,可能致使get與post的鍵衝突,而且頻率也不高。因此,並不使用request。
var_dump($_REQUEST);

六、HTTP文件上傳變量:$_FILES
經過HTTP POST方式上傳到當前腳本的項目的數組。
var_dump($_FILES);

七、HTTP Cookies:$_COOKIE
取到頁面中的Cookie信息
1 setcookie("cookie","haha");

2 $_COOKIE["hehe"] = "hehe";

3 var_dump($_COOKIE); 


八、Session變量:$_SESSION
取到保存在Session中的信息。
session_start();
$_SESSION["haha"] = "haha";
var_dump($_SESSION);*/

九、Global變量:$GLOBALS
$GLOBALS包含了上述8個全局數組,能夠經過$GLOBALS["_SERVER"]取到$_SERVER
還能夠經過給$GLOBALS數組追加下標。建立全局變量,能夠在函數裏函數外隨意訪問:$GLOBALS["name"] = "zhangsan";
var_dump($GLOBALS["_SERVER"]);

 

4、數組功能

 

一、返回數組全部的值,返回數組
var_dump(array_values($arr));

二、返回數組全部的鍵,返回數組
var_dump(array_keys($arr));

三、檢測數組中是否包含某個值。返回真、假
參數:須要查詢的值,數組,true(===)/false(===) 默認
var_dump(in_array("8",$arr,true));

四、交換數組中的鍵和值,返回新數組
var_dump(array_flip("8",$arr));

五、反轉數組,返回新數組
參數:須要反轉的數組
true:保留原有索引數組的下標與值的匹配。
false:只反轉值,鍵不反轉,默認
不管true/false,都不會影響關聯數組,關聯數組鍵,值永遠是一對。
var_dump(array_reverse($arr,true));

六、統計數組元素個數
count($arr);

七、統計數組中,全部值出現的次數,返回一個新數組
新數組格式:鍵-->原數組的值(去重後的值)
值-->原數組對應的值出現的次數。
var_dump(array_count_values($arr));

八、移出數組中重複的值!
var_dump(array_unique($arr));

九、過濾數組中的每個值:
①不傳回調函數:過濾掉全部空值(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);

 

5、數組函數

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)
返回值:數組(被刪掉的部分)
參數:
一、數組的地址,會修改原數組
二、從第幾位開始刪
三、刪除的長度,不填默認到結尾
四、不填,默認爲刪除,填,用填的部分替換刪掉的部分;
$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/  
相關文章
相關標籤/搜索