陣列就是一群變數的集合,這群變數有相同或類似的性質,比如學生的成績:

大明-98
小花-82
小乖-60
仔仔-31
妮妮-77

假如不使用陣列的話,那麼當我們想要列出所有學生的成績時,必須每個學生指定一個變數來記錄成績,然後再列印出來:

$A=98
$B=82
$C=60
$D=31
$E=77

然後列印成績的指令得一行一行打;

echo $A;
echo $B;
echo $C;
echo $D;
echo $E;

當資料筆數有上百或上千筆時,這樣的做法是非常沒效率的,所以我們需要一個可以簡化的做法來紀錄和列印大量資料的方式,陣列就是一個方法;

當我們使用陣列時,必須給定一個變數名來代表資料的名稱,方便自己辦識,比如用”score”來代表學生的成績.

現在我們可以把學生的成績用score來表示,但我們需要辨識每個學生的成績,所以我們得加上”索引”,索引通常是編號,由0開始,有時也可以使用字串來當索引,我們把學生的成績使用陣列來表示如下;

$score[0]=98;
$score[1]=82;
$score[2]=60;
$score[3]=31;
$score[4]=77;

現在,我們只需要記住score和索引,就可以取代之前記住五個名字或五個變數的麻煩,在辦識上也變得簡單了,那麼列印資料是不是也變得簡單了?

由於陣列的變數名稱是一樣的,改變的只有索引值,而索引值又是數字,可以透過運算來改變,因此我們可以使用迴圈來簡化列印的工作:

for($i=0,$i<count($score),$i++){
  echo $score[$i]." ";
}

我們利用count()函數來計算陣列$score裏的元素個數,在echo時,我們在索引值裏帶入$i的數值,$i會在每跑一次迴圈時自動加1,這樣我們就可以得到$score[0]~$score[4]的成績了.

多維陣列的觀列就是一維陣列的延伸,等於是一維陣列裏的每個元素都各自代表了另一個陣列,以學生成績來舉例就是一位學生有多科的成績;

國文,數學,英文,地理,自然

大明-98,22,34,68,99
小花-82,74,56,77,65
小乖-60,60,56,54,53
仔仔-31,45,99,76,89
妮妮-77,21,23,44,12

如果我們想用一維陣列來表示學生多科成績的話,可以把成績當成字串放入一維陣列,但是這樣的話,如果要處理單科成績時會變得很麻煩;

$score[0]="98,22,34,68,99";
$score[1]="82,74,56,77,65";
$score[2]="60,60,56,54,53";
$score[3]="31,45,99,76,89";
$score[4]="77,21,23,44,12";

如果是這樣的紀錄方式,那麼我們要取出某科的成績時就得先把學生的成績全列出來,再以字串處理的方式去抓出某科的資料:

比如:列印每位學生的英文成績

步驟:

1.找出學生0的成績:$score[0] -> 98,22,34,68,99
2.英文是第2個逗號後到第三個逗號的數字 -> 34
3.echo 34
4.找下一位學的生的成績
5..重覆2~4

我們可以用二維陣列來簡化資料的紀錄與後續的處理,我們把國文,數學,英文,地理,自然這5個科目,分別以索引值0~4來代表,這樣我們可以延續先前提到的一維陣列來紀錄學生的每科成績.

$score[0][0]=98
$score[0][1]=22
$score[0][2]=34
$score[0][3]=68
$score[0][4]=99

$score[1][0]=82
$score[1][1]=74
$score[1][2]=56
$score[1][3]=77
$score[1][4]=65

$score[2][0]=60
$score[2][1]=60
$score[2][2]=56
$score[2][3]=54
$score[2][4]=53

$score[3][0]=31
$score[3][1]=45
$score[3][2]=99
$score[3][3]=76
$score[3][4]=89

$score[4][0]=77
$score[4][1]=21
$score[4][2]=23
$score[4][3]=44
$score[4][4]=12

其中,$score第一個索引值代表的是學生,而第二個索引值則是代表科目,如果我們現在要列印每個學生的英文成績,那麼只要指定第二個索引值的內容為2就可以了:

echo $score[0][2]."<br>";
echo $score[1][2]."<br>";
echo $score[2][2]."<br>";
echo $score[3][2]."<br>";
echo $score[4][2]."<br>";

用迴圈來處理會更快

for($i=0 ; $i<count($score) ; $i++){
echo $score[$i][2]." ";
}

在這個迴圈中,我們要顯示的是每個學生的某科成績,所以迴圈要跑的次數是學生的數量,而學生的數量是在第一個索引值中,因此我們以count($score)來取得第一個索引的個數,如果我們要列印的是全部科目的成績,那麼可以用count($score[0])來取得科目的數量,在迴圈的內部我們要列印的是英文字,因此只需要第2個索引值固定在2就可以了,而第一個索引值則帶入$i,如此才可以取得每位學生的英文成績.

因此,既然我們已經以二維陣列來紀錄學生的每科成績了,當然就可以用迴圈來顯示每位學生的每科成績了,在這裏要注意的是,因為我們的條件是”每位學生”及”每科成績”,因此”每位學生”是一個迴圈,”每科成績”也是一個迴圈,所以要使用巢狀迴圈來顯示.

for($i=0;$i<count($score);$i++){
echo "student ".$i.":";
for($j=0;$j<count($score[0]);$j++){
echo $score[$i][$j].",";
}
echo " ";
}

要注意的是,在巢狀迴圈中,每一層的計數變數不能相同,所以第一層使用$i,第二層則是使用了$j,每一層迴圈都可以獨立處理一些作業,所以我在第一層迴圈列印了字串”student”然後加上$i這個變數值,這樣會顯示出student 0~student 4這樣的字串在網頁上,而第二層則是要顯示每科成績,這時把$i和$j分別帶入第一個索引值和第二個索引值,然後我們在每次顯示不同科目成績後加入一個逗號”,”,當內圈$j執行完畢時,會回到$i這一層,此時我們加上了一個斷行標籤<br>,那麼在網頁上時示時就會在每位學生的每科成績顯示完後,換到下一行,然後顯示下一位學生的每科成績.
網頁上呈現的結果:

student 0:98,22,34,68,99,
student 1:82,74,56,77,65,
student 2:60,60,56,54,53,
student 3:31,45,99,76,89,
student 4:77,21,23,44,12,

以上,就是陣列的觀念及迴圈的應用,建立了對陣列的認識和了解後,後續我們可以進一步的去了解陣列的宣告及建立的方式

最後修改日期: 2018-10-03

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。