Board logo

標題: [教學] (PHP+IIS+MsSQL教學第10篇) 認識陣列 [打印本頁]

作者: 小誌    時間: 2010-5-13 18:28     標題: (PHP+IIS+MsSQL教學第10篇) 認識陣列

認識陣列
什麼叫陣列(Array)?陣列就是一個集合變數,陣列就如變數一般,可用來儲存資料,一般的變數只能存放一筆資料,而陣列則可以存放多筆資料,簡言之,陣列就一群資料型態相同的變數集合。

陣列是一群變數的集合,您不妨將陣列想像成一間旅館,旅館內會有很多房間可以讓旅客居住,相對於我們的程式而言,這些房間就是變數,旅客則是我們的資料。

旅館的房間有所謂的房間號碼,相對於我們的陣列,這些房間號碼就是所謂的「index(索引、註標)」。
[attach]359[/attach]

初始陣列
使用陣列之前必須先進行初始的程序,與變數宣告相同:
標準陣列初始格式
  1. $陣列名稱[]=初始值;
複製代碼
例如:
  1. $X[] =”com”;
  2. $X[] =”gov”;
  3. $X[] =”net”;
  4. $X[] =”tw”;
  5. $X[] =”int”;
複製代碼
上式中:因為我們沒有特別指定陣列中的元素註標值,因此陣列X為採用預設的註標索引編號,可存放之資料最大註標(即陣列的大小-1)為4。


[attach]360[/attach]
在上圖中,我們建立一個可以存放5筆資料的陣列,通知系統建立出5個存放資料的記憶體空間,而這些記憶體空間則為陣列「X」所擁有。
完成陣列的宣告後,我們就可以存取陣列中每一個位置的資料,例如:
  1. $Myarray[0] = 999;  //將資料存放置陣列位置0中
複製代碼
或是:
  1. $Myarray[0] = 999  //將資料存放置陣列位置0中
  2. $Myarray[1] = 888  //將資料存放置陣列位置1中
  3. //出陣列位置0與1的資料相減,並存至陣列位置2中
  4. $Myarray[2] = $Myarray[0]- $Myarray[1]
複製代碼
「陣列位置」就是所謂的陣列「註標(subscript、index)」,而陣列中所存放的每項資料稱之為「元素(element)」,「註標」是我們存取陣列資料的依據,例如我們有一個大小為’5’(五個資料項存放空間)陣列,則該陣列就有「0、1、2、3、4」五個註標:
[attach]361[/attach]

陣列於建立之時,若不同時指定陣列元素的初始值,此時,我們可以透過『array』函數將多項資料存放於變數中,使變數轉換為陣列(不需要個別指定陣列元素),同時,我們所指定存放的多項資料將成為陣列中的元素值:
陣列初始值宣告格式
  1. $陣列名稱=array(資料1,資料2,資料3…);
複製代碼
例如:
  1. $testArray=array(”你”,”我”,”他”);
複製代碼
此時,testArray就是一個大小為3的陣列,其含有3個元素,而註標編號為0、1、2,註標編號1的元素存放資料「你」,註標編號2的元素存放資料「我」,註標編號2的元素存放資料「他」。

提示!
若已知陣列元素的個數則透過『Array』函數將多項資料存放於變數中,使變數轉換為陣列,若不知陣列元素的個數有多少個,則先個別指定已知的陣列元素。


陣列的使用
陣列資料存取
不可一次指定陣列內的元素資料值,例如:
  1. ‘逐個元素指定
  2. $Myarray[0] = 999;
  3. $Myarray[1] = 999;
  4. $Myarray[2] = 999;
  5. $Myarray = 999;  //錯誤, 不可一次指定陣列內的元素資料值
複製代碼
在上例中,我們已透過逐個個元素指定的方式建立陣列Myarray,但是又使用「$Myarray = 999;」敘述指定Myarray,此時原先的陣列Myarray已經消失而變成變數Myarray。
不可一次讀取陣列內的元素資料值,例如:
  1. $Myarray = Array(3,6,9);
  2. echo $MyArray ; //錯誤
複製代碼
上例之執行結果如下圖所示,輸出的結果為錯誤訊息,因為「echo $MyArray ;」敘述變成要求輸出一個未初始的變數:
[attach]362[/attach]
   
要讀出陣列元素資料值,必須逐項讀出:
  1. $Myarray = array(“春天”,”夏天”,”秋天”,”冬天”);
  2. echo $Myarray[0];  //印出春天
  3. echo $Myarray [1];  //印出夏天
  4. echo $Myarray [2];  //印出秋天
  5. echo $Myarray [3];  //印出冬天
複製代碼
還好,我們的陣列元素只有四個,如果有40個,那我們可得寫40行敘述才能將陣列內的元素資料全部列印出來!可是,總會遇到元素很多的時候吧!那我們就可以配合迴圈敘述來做,例如用for迴圈來列印出全部的陣列資料:
  1. $Myarray = array(“春天”,”夏天”,”秋天”,”冬天”);
  2. for ($I=0 ; $I<=3 ; $I++)
  3. {
  4. echo “$Myarray[$I] . <br>”;
  5. }
複製代碼
[attach]363[/attach]


註標範圍
存取陣列資料不可超過註標範圍。
  1. //宣告4個元素的陣列,註標由0至3
  2. $Myarray = $array(“春天”,”夏天”,”秋天”,”冬天”);
  3. echo $Myarray[5];  //錯誤
  4. echo $Myarray[-1];  //錯誤
複製代碼
陣列大小(長度)
建立陣列後,我們可以直接使用count()函數得知陣列的大小(長度),我們只要將count()函數得知的陣列大小加1就是陣列元素的最大註標。
例如:
  1. $Myarray = array(3,6,9);
  2. echo (count($Myarray)); //列印出陣列大小3
  3. echo (count($Myarray)-1) //列印出最大陣列註標2
複製代碼
因此,我們可以將上個範例的FOR程式敘述更改為使用『count()』函數:
  1. $Myarray = array("春天","夏天","秋天","冬天");
  2. for ($I=0 ; $I<count($Myarray) ; $I++)
  3. {
  4. echo "$Myarray[$I] <br>";
  5. }
複製代碼
在上例中,我們將count()函數放在for迴圈敘述的轍是條件中,雖然敘述簡短,但卻是不智之舉,因為迴圈每次執行時都得呼叫一次count()函數,造成程式執行效率不佳,所以要把count()函數提出迴圈外利用才對:
  1. $Myarray = array("春天","夏天","秋天","冬天");
  2. $num=count($Myarray);
  3. for ($I=0 ; $I<$num ; $I++)
  4. {
  5. echo "$Myarray[$I] <br>";
  6. }
複製代碼
移除陣列元素
當我們需要移除某個陣列中的變數時,可使用『unset()』函數,unset()函數不僅可以移除陣列中的元素,甚至可以用來毀滅變數(釋放變數空間),例如:
  1. $Myarray = array("春天","夏天","秋天","冬天");
  2. $num=count($Myarray);
  3. for ($I=0 ; $I<$num ; $I++)
  4. {
  5. echo "$Myarray[$I] <br>";
  6. if ($Myarray[$I]=="秋天")
  7.     unset($Myarray[$I]);
  8. }
複製代碼
非連續註標陣列
當我們在初始陣列並給定陣列元素值時,則元素註標會自動的從0開始編號,每增加一個元素時,註標編號自動依序遞增,而成為連續註標陣列。
有時候,您或許需要以跳號的方式來編排註標,那就可以在初始陣列時給予任何整數的註標指定,這就是非連續註標陣列:
  1. $X[10] =”com”;
  2. $X[20] =”gov”;
  3. $X[50] =”net”;
  4. $X[100] =”tw”;
  5. $X[160] =”int”;
複製代碼
若已經指定了非連續註標陣列,接著又增加了一個沒有指定註標編號的元素時,則此元素的註標會被設定為現有陣列元素中最高索引註標編號加1:
  1. $X[252] =”com”;
  2. $X[20] =”gov”;
  3. $X[100] =”net”;
  4. $X[] =”tw”; //元素註標為252+1
複製代碼
foreach迴圈的使用
當我們使用標準的for迴圈敘述來輸出陣列內全部的元素時,必須指定for迴圈的計數變數初值與終止條件,這對於連續註標陣列是可行的,但是對非連續註標陣列可就行不通了,因為非連續註標陣列的元素註標示隨意亂跳的,因此,就必須透過「foreach」迴圈敘述來替代for迴圈敘述:
  1. foreach迴圈敘述格式
  2. Foreach(陣列 as $value)
  3. {
  4.      敘述區塊;
  5. }
複製代碼
例如:
  1. <?
  2. $X[252] ="com";
  3. $X[20] ="gov";
  4. $X[100] ="net";
  5. $X[] ="tw";

  6. foreach ($X as $value)
  7. {
  8. echo "$value <br>";
  9. }
  10. ?>
複製代碼
上例中的「$value」只是一個暫存變數,用來臨時裝載陣列中的元素資料值,迴圈每執行一次,「$value」暫存變數的內容就存放不同註標編號內的元素資料值。
當然,foreach迴圈敘述也適用於連續註標陣列:
  1. <?
  2. $Myarray = array("春天","夏天","秋天","冬天");
  3. foreach ($Myarray as $value)
  4. {
  5. echo "$value <br>";
  6. }
  7. ?>
複製代碼
字串註標陣列
字串註標陣列其實也是非連續註標陣列,通常陣列的註標索引都會以整數來作為識別編號,但PHP中允許我們以字串來作為註標識別索引:
  1. <?
  2. $Myarray["charles"] = "小誌";
  3. $Myarray["egge"] = "小魚";
  4. $Myarray["chiey"] = "小魏";
  5. $Myarray["connie"] = "無尾熊";

  6. foreach ($Myarray as $value)
  7. {
  8. echo "$value <br>";
  9. }
  10. ?>
複製代碼
如果使用字串註標陣列,那array()函數還可以使用嗎?當然可以,但是必須配合『=>(指標、指向)』運算子,把字串註標跟元素值分別擺放在『=>(指標、指向)』運算子左右兩側:
  1. <?
  2. $Myarray=array("charles" => "小誌",
  3.                "egge" => "小魚",
  4.                "chiey" => "小魏",
  5.                "connie" => "無尾熊");

  6. foreach ($Myarray as $value)
  7. {
  8. echo "$value <br>";
  9. }
  10. ?>
複製代碼
foreach迴圈的進階使用
通常我們是不需要使用到元素的註標值,但是您既然使用字串註標陣列,想必使用到註標值的機會就比較大了,標準的foreach迴圈敘述就不夠用了,這時候可以使用進階的foreach迴圈敘述:
foreach迴圈敘述格式
  1. foreach(陣列 as $key => $value)
  2. {
  3.      敘述區塊;
  4. }
複製代碼
上式中的「$value」只是一個暫存變數,用來臨時裝載陣列中的元素資料值,而「$key」也是一個暫存變數,用來臨時裝載陣列中的元素註標,例如:
[attach]364[/attach]
  1. <?
  2. $Myarray=array("charles" => "小誌",
  3.                "egge" => "小魚",
  4.                "chiey" => "小魏",
  5.                "connie" => "無尾熊");

  6. foreach ($Myarray as $key => $value)
  7. {
  8. echo "元素註標: $key ; 元素值: $value <br>";
  9. }
  10. ?>
複製代碼





歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)