文章出處

數組

數組基礎

  • 含義:

    數組就是一系列數據的集合體,他們按設定的順序排列為一個“鏈的形狀”。

    注意: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

其中,該箭頭,就是數組內部的所謂“指針”——注意,不可見,不可輸出,只是一種輔助理解的圖形!

說明:

  1. 該箭頭,就是數組內部的所謂“指針”
  2. 默認情況下,該指針指向數組的第一個單元。
  3. 數組的有關單元的操作,如果沒有指定下標,則就是針對該指針指向的單元的操作。
  4. 所謂遍歷,其實就是一次次取得當前單元的鍵和值,并放入對應的變量$key, $value,然后移動指針到下一個單元。

則,數組,作為一個“總體數據單位”,有如下指針操作函數可以使用:

  1. $v1 = current($數組); //獲得數組的當做指針所在單元的“值”;
  2. $v2 = key($數組); //獲得數組的當做指針所在單元的“鍵”(下標);
  3. $v3 = next($數組); //先將數組的指針移向下(后)一個單元,然后取得該新單元的值;
  4. $v4 = prev($數組); //先將數組的指針移向上(前)一個單元,然后取得該新單元的值;
  5. $v5 = end($數組); //先將數組的指針直接移向最后一個單元,然后取得該新單元的值;
  6. $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

規律描述:

  1. 假設數組的數據有n個。
  2. 要進行比較的“趟數”為n-1;
  3. 每一趟要比較的數據個數都比前一趟少一個,第一趟要比較n個(即比較n-1次)
  4. 每一次比較,如果發現“左邊數據”大于“右邊數據”,就對這兩者進行交換位置。

代碼演示如下:

  • 演示數組為:
    $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

規律描述:

  1. 假設數組的數據有n個。
  2. 要進行查找最大值單元并進行交換的“趟數”為n-1;
  3. 每一趟都要求出“剩余數據”中的最大值單元,并且,剩余數據的數量每一趟都少1個,第一趟有n個。
  4. 每一趟找出最大值單元后,都要進行交換:最大值單元,跟剩余數據中的最后一個單元交換。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()