數組
數組基礎
含義:
數組就是一系列數據的集合體,他們按設定的順序排列為一個“鏈的形狀”。
注意:php中的數組單元的順序,跟下標無關!
數組定義(賦值):
$arr1 = array(3, 11, 5, 18, 2 );//這是最常見的數組,索引數組,下標為“默認下標”,就是從0開始的整數;
$arr2 = array(“a”=>3, “bb”=>11, “cc123”=>5, ‘d1’=>18, ‘xyz’=>2 ); //關聯數組,下標為字符串,常見
$arr3 = array(1=>3, 10=>11, 3=>5, 0=>18, 88=>2 ); //下標可以人為給定;
$arr4 = array(1=>3, ‘a1’=>11, 3=>5, ‘mn’=>18, 88=>2 ); //下標可以數字和字符串混合使用;
$arr5 = array(5=>3, 11, 3=>5, ‘mn’=>18, 2 ); //有指定下標,也有“自動下標”,
//此時下標為:5,6,3,”mn”, 7
//可見,自動下標為“前面最大數字下標+1”
$arr6 = array(5=>3, 7.7=>11, 3=>5, ‘mn’=>18, 2 ); //此時下標為:5,7,3,”mn”, 8
$arr7 = array(5=>3, true=>11, false=>5, ‘mn’=>18, 2 ); //此時下標為:5,1,0,”mn”, 6
$arr8 = array(1=>3, 3=>33, true=>11, ); //此時下標為:1,3,其對應值為:11, 33
//下標如果有重復,后面的值覆蓋前面的值;
$arr9 = array(1=>3, -3=>33, 11, ); //此時下標為:1, -3, 2,注意:最后一個逗號“可以有”。
其他一些形式:
$arr10[] = 3;
$arr10[] = 11;
$arr10[] = 5; //該數組下標為0,1,2,常規情況
$arr11[‘a’] = 3;
$arr11[‘bb’] = 11;
$arr11[‘cc123’] = 5; //該數組下標為’a’,’bb’,’cc123’,常規情況
$arr12[1] = 3;
$arr12[] = 11; //此時下標為2
$arr13[‘cc123’] = 5; //該數組下標為1,2,’cc123’
特別注意:php中,數組單元的順序,是由其“放入”順序決定,而不是下標。
數組取值:
$v1 = $arr1[0];
$i = 3;
$v2 = $arr1[$i]; //取得數組下標為3的單元的值;
總體上,可以將取得一個數組的單元的值,看組取得一個變量的值完全一樣!!!
數組的分類
1.按鍵值關系來分:
索引數組:通常認為,如果一個數組的下標是嚴格按照從0開始的連續的整數作為下標,則稱其為索引數組——就是類似js數組的下標。例如:
$arr1 = array(3, 11, 5, 18, 2 );//這是最常見的數組,下標為“默認下標”,就是從0開始的整數;
關聯數組:通常認為,如果一個數組的下標都是一個“字符串”并一定程度上表名了該單元的“含義”,則稱為關聯數組,例如:
$conf = array( ‘host’=>”localhost” , ‘port’=>3306 , ‘username’=>’root’ , ‘password’ => ‘123’ , );
混合數組:既有數字下標,也有字符下標的情況:
$arr4 = array(1=>3, ‘a1’=>11, 3=>5, ‘mn’=>18, 88=>2 ); //下標可以數字和字符串混合使用;
2.按數組的維數(復雜程度)分:
一維數組:
$a = array(1, 11, 111); $b = array(2, 22, 222); $c = array(3, 33, 333);
二維數組:
$dd = array( array(1, 11, 111), array(2, 22, 222), array(3, 33, 333) );
多維數組:無非就是繼續里面再用數組代替。
數組的基本使用
1.求一個一維數組的平均值:
2.求一個二維數組的平均值:
3.求一個一維數組的最大值:
4.求交換一個一維數組的最大值和最小值的位置:
有關數組的交換,再說兩句:
$a = array( 3, 11, 5, 7, 20, 18); //下標是0,1,2,3,4,5
需求1:交換數組第0項和第3項:
$v1 = $a[0]; $v2 = $a[3]; $t = $v1; $v1 = $v2; $v2 = $t; //這種做法根本不行,因為v1,v2只是2個變量,跟數組沒有關系了!
正確的做法是:
$t = $a[0]; $a[0] = $a[3]; $a[3] = $t;
需求2:交換數組首項和末項:
$pos1 = 0; //首項的下標 $pos2 = count($a) - 1; //最后一項的下標 $t = $a[$pos1]; $a[$pos1] = $a[$pos2]; $a[$pos2] = $t;
需求3:交換數組最大項和最小項:
$pos_max = ....; //經過一番計算得到最大項的下標; $pos_min = ....; //經過一番計算得到最小項的下標 $t = $a[$pos_max]; $a[$pos_max] = $a[$pos_min]; $a[$pos_min] = $t;
數組的遍歷
foreach基本語法
foreach( $數組變量名 as 【$key =>】 $value ){ //循環體;這里可以去“使用”$key 和 value; //$key 和 $value 就是該遍歷語句一次次取得的數組的每一個單元(項)的下標和對應值。 //而且,它總是從數組的開頭往后按順序取數據。 }
數組的指針操作及遍歷原理:
首先,看看數組的一個“形象圖”:
$arr4 = array(1=>3, ‘a1’=>11, 3=>5, ‘mn’=>18, 88=>2 );
可以將其以視覺化的方式理解為:
數組下標: | 1 | “a1” | 3 | “mn” | 88 |
對應數據: | 8 | 11 | 5 | 18 | 2 |
其中,該箭頭,就是數組內部的所謂“指針”——注意,不可見,不可輸出,只是一種輔助理解的圖形!
說明:
- 該箭頭,就是數組內部的所謂“指針”
- 默認情況下,該指針指向數組的第一個單元。
- 數組的有關單元的操作,如果沒有指定下標,則就是針對該指針指向的單元的操作。
- 所謂遍歷,其實就是一次次取得當前單元的鍵和值,并放入對應的變量$key, $value,然后移動指針到下一個單元。
則,數組,作為一個“總體數據單位”,有如下指針操作函數可以使用:
- $v1 = current($數組); //獲得數組的當做指針所在單元的“值”;
- $v2 = key($數組); //獲得數組的當做指針所在單元的“鍵”(下標);
- $v3 = next($數組); //先將數組的指針移向下(后)一個單元,然后取得該新單元的值;
- $v4 = prev($數組); //先將數組的指針移向上(前)一個單元,然后取得該新單元的值;
- $v5 = end($數組); //先將數組的指針直接移向最后一個單元,然后取得該新單元的值;
- $v6 = reset($數組); //先將數組的指針直接移向第一個單元,然后取得該新單元的值;
foreache遍歷流程原理圖:
foreach( $數組變量名 as $key => $value ){ //循環體;這里可以去“使用”$key 和 value; //$key 和 $value 就是該遍歷語句一次次取得的數組的每一個單元(項)的下標和對應值。 //而且,它總是從數組的開頭往后按順序取數據。 }
其基本原理示意圖如下:
輸出結果為:
可見:遍歷之后,指針已經超出數組合理位置了。
使用for和next遍歷數組
注意:對php數組,往往不能單純使用for循環進行遍歷。
或者說:php中,使用for循環只能循環“下標為連續的純整數數組”;
結果:
each()函數的使用
each()函數的作用:先取得一個數組的“當前單元”的下標和值(并放入一個數組),然后將指針移到下一個單元。
使用形式:
$a = each($數組名); //此時$a就是一個數組了
list()“函數”的使用:
list()函數用于一次性取得一個數組中從0開始的數字下標的多個單元的值!
形式:
list($變量1,$變量2,$變量3, .. ) = $數組;
作用:
上述一行代碼相當于如下代碼:
$變量1 = $數組[0]; $變量2 = $數組[1]; $變量3 = $數組[2]; ........
注意:這里變量的個數,要跟該數組的數字下標的單元對應,如果某個變量對應的該數字下標不存在,就會報錯!
while+each()+list()遍歷數組
數組變量的一些細節
- foreach也是正常的循環語法結構,可以有break和continue等操作。
遍歷過程中值變量默認的傳值方式是值傳遞。
結果為:
遍歷過程中值變量可以人為設定為引用傳遞:foreach($arr as $key => &$value){ ... }
結果為:
foreach默認是原數組上進行遍歷。但如果在遍歷過程中對數組進行了某種修改或某種指針性操作,則會復制數組后在復制的數組上繼續遍歷循環(原數組保持不變)。
以下演示的是“foreach默認是原數組上進行遍歷”的效果:
然后,再演示:在某些情況下(修改或指針操作),不是在原數組身上進行遍歷。
結果為:
foreach中如果值變量是引用傳遞,則無論如何都是在原數組上進行。
數組排序
排序函數簡單演示(應用級別):
結果為:
結果為:
更多排序函數,請查手冊:
- 手冊》函數參考》與變量有關的擴展》數組》Sorting Arrays
冒泡排序算法
演示數組為:
$a = array(9, 3, 5, 8, 2, 7); //下標為0,1,2,3,4,5
演算過程描述:
從數組的左邊開始,依次兩兩比較相鄰的2個數據的大小,如果發現左邊的比右邊的大,則將他們進行交換。這樣進行“一趟”之后,必然可以確定最大的一個數據放在最右邊。
按此方式,對“剩余的數據”繼續進行下一趟,則有會確定這些剩余數據耳朵最大值放在剩余位置的最右邊。
演示:
原始數組: | 9 | 3 | 5 | 8 | 2 | 7 |
第1趟后: | 3 | 5 | 8 | 2 | 7 | 9 |
第2趟后: | 3 | 5 | 2 | 7 | 8 | 9 |
第3趟后: | 3 | 2 | 5 | 7 | 8 | 9 |
第4趟后: | 2 | 3 | 5 | 7 | 8 | 9 |
第5趟后: | 2 | 3 | 5 | 7 | 8 | 9 |
規律描述:
- 假設數組的數據有n個。
- 要進行比較的“趟數”為n-1;
- 每一趟要比較的數據個數都比前一趟少一個,第一趟要比較n個(即比較n-1次)
- 每一次比較,如果發現“左邊數據”大于“右邊數據”,就對這兩者進行交換位置。
代碼演示如下:
- 演示數組為:
$a = array(9, 3, 5, 8, 2, 7); //下標為0,1,2,3,4,5 演算過程描述:
求得一個數組的最大值的下標,并將這個最大值下標的單元跟最后一個單元進行交換;
然后,繼續從剩余數據中取得最大值的下標,并將這個最大值下標的單元跟剩余的最后一個單元交換
以此類推,直到只剩下一個數據,就不用找了。
演示:
原始數組: | 9 | 3 | 5 | 8 | 2 | 7 |
第1趟后: | 7 | 3 | 5 | 8 | 2 | 9 |
第2趟后: | 7 | 3 | 5 | 2 | 8 | 9 |
第3趟后: | 2 | 3 | 5 | 7 | 8 | 9 |
第4趟后: | 2 | 3 | 5 | 7 | 8 | 9 |
第5趟后: | 2 | 3 | 5 | 7 | 8 | 9 |
規律描述:
- 假設數組的數據有n個。
- 要進行查找最大值單元并進行交換的“趟數”為n-1;
- 每一趟都要求出“剩余數據”中的最大值單元,并且,剩余數據的數量每一趟都少1個,第一趟有n個。
- 每一趟找出最大值單元后,都要進行交換:最大值單元,跟剩余數據中的最后一個單元交換。
文章列表