麻辣家族討論版版's Archiver

小誌 發表於 2010-5-13 18:28

(PHP+IIS+MsSQL教學第10篇) 認識陣列

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

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

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

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


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

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

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


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


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

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

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

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

foreach ($Myarray as $key => $value)
{
echo "元素註標: $key ; 元素值: $value <br>";
}
?>[/code]

頁: [1]

麻辣家族討論版版為 麻辣學園 網站成員  由 昱得資訊工作室 © Since 1993 所提供