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

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();將函數打亂重新排序

 

好啦~~~今天的內容先分享到這裏,小女子小菜鳥一隻,還請各位園友多多指教·喜歡就點個贊吧~感謝支持!

發佈了20 篇原創文章 · 獲贊 13 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章