PHP

陣列array

電腦擁有快速的計算能力,不拿來處理大量的資料就太可惜了。在電腦中要處理資料都是要先放在變數當中,前面同學們所學習到的變數中,每一個變數只能放一個資料,每次如果要增加資料時就要再另外準備一些變數對應,這樣並不是聰明的做法。PHP要處理大量資料,都是使用陣列來儲存,本文就來說明如何在PHP運用陣列在處理大量資料上的作法。

定義陣列

以下是陣列的定義方式:

$data = array("Richard", "Mary", "Judy", "Tom");

上面的例子我們定義了一個陣列變數$data,它的內容包括了"Richard"等4個字串資料,每一個資料照順序放置,存取時就可以以$data為名,再加上中括號以及索引數字操作特定的資料項目。$data[0]的內容就是"Richard",$data[1]的內容就是"Mary",依此類推。

取出所有陣列元素

所以,如果我們打算把$data的所有內容都列印出來,可以使用以下的這個迴圈:

  for($i=0; $i<4; $i++) {
  	echo $data[$i] . "<br/>\n";
  }

但是上面這種方式需要事先知道陣列的長度才不致於存取到實際上不存在的資料位置,求陣列長度的函數是count(),用法如下:

  for($i=0; $i<count($data); $i++) {
  	echo $data[$i] . "<br/>\n";
  }

foreach迴圈指令

還有一個比較直覺的方法就是利用foreach迴圈指令,顧名思義,這個迴圈會把陣列的內容逐一取出,其用法如下:

<?php
  $data = array("Richard", "Mary", "Judy", "Tom");

  foreach ($data as $d) {
    echo "Good morning, $d!<br/>\n";
  }
?>

執行結果如下:

Good morning, Richard!
Good morning, Mary!
Good morning, Judy!
Good morning, Tom!

從上面的應用可以看出,在foreach指令中,不論陣列中有多少資料項,此迴圈都不需要另外改寫程式碼,所有的資料項都會被取出並加以顯示。

新增陣列元素

已經建立好的陣列變數也可以再額外增加資料項進去,只要在陣列變數後面的中括號中不要加入索引值就可以了,它會自動地在所有資料的後面再附加上我們所指定的資料項,範例程式如下:

<?php
  $data = array("Richard", "Mary", "Judy", "Tom");

  $data[] = "Kim";
  $data[] = "Iris";
  foreach ($data as $d) {
    echo "Good morning, $d!<br/>\n";
  }
?>

以下是執行結果:

Good morning, Richard!
Good morning, Mary!
Good morning, Judy!
Good morning, Tom!
Good morning, Kim!
Good morning, Iris!

當然,如果在中括號中指定了索引數字,就可以用來修改或取代後來的資料項目內容。另外,有一個叫做array_push()的函數也可以用來把資料加入陣列變數的作業,方法如下:

<?php
  $data = array("Richard", "Mary", "Judy", "Tom");

  array_push($data, "Kim", "Iris", "Lisa");
  foreach ($data as $d) {
    echo "Good morning, $d!<br/>\n";
  }
?>

從程式的內容可以很清楚地看出使用array_push即可一次加入多個資料項目。

非數字索引(字典)

大量的資料處理有許多情況是以文字來作為索引會比較方便,此種功能在許多其它的程式語言中把它歸類為字典型態。在PHP中我們把它稱為關聯式陣列,典型的關聯式陣列資料之定義與應用方式如下:

<?php
  $dict = array("Richard"=>174, "Mary"=>165, "Judy"=>158, "Tom"=>180);

  foreach ($dict as $name=>$height) {
    echo "$name's height is $height.<br/>\n";
  }
?>

此種陣列其元素分成兩種型式,就是「鍵=>值」(「key => value」),鍵就是文字索引,而值就是它真正的內容。上面的程式利用foreach逐一取出每一個資料項目,並把鍵和值分別對應到$name以及$height這兩個資料項中,如此就可以逐一取出資料並依正確的型式列印出來。

上述程式的執行結果如下:

Richard's height is 174.
Mary's height is 165.
Judy's height is 158.
Tom's height is 180.

由於關聯式資料項目間沒有先後的順序關係,因此要加入新的資料項目只要使用以下的這種方法即可:

$dict["Stark"]=195;

二維陣列

陣列的元素也可以是陣列,此種陣列就叫做二維陣列。以下程式是定義及運用二維陣列的例子:

<?php
  $data["Richard"] = array(80, 95, 98);
  $data["Tom"] = array(65, 78, 90);
  $data["Mary"] = array(98, 95, 93);

  echo "<table border=1 bgcolor=aliceblue>\n";
  echo "<tr><td>Name</td>\n";
  echo "<td>Chinese</td>\n";
  echo "<td>English</td>\n";
  echo "<td>Mathematics</td></tr>\n";
  foreach ($data as $name=>$score) {
    echo "<tr><td>$name</td>\n";
    foreach($score as $item) {
      echo "<td>$item</td>\n";
    }
    echo "</tr>\n";
  }
  echo "</table>\n";
?>

此程式的前3行定義了3位同學的3科成績,之後再利用產生HTML表格的方式,分別把每一個人的姓名、國文、英文、以及數學成績透過表格呈現在瀏覽器中,執行的結果如下:

網頁HTML原始碼如下:

<table border=1 bgcolor=aliceblue>
<tr><td>Name</td>
<td>Chinese</td>
<td>English</td>
<td>Mathematics</td></tr>
<tr><td>Richard</td>
<td>80</td>
<td>95</td>
<td>98</td>
</tr>
<tr><td>Tom</td>
<td>65</td>
<td>78</td>
<td>90</td>
</tr>
<tr><td>Mary</td>
<td>98</td>
<td>95</td>
<td>93</td>
</tr>
</table>

因為我們在程式中適當地加上了換列指令,所以網頁的HTML原始碼的可讀性就比較高了。

排列陣列元素的順序

陣列中的元素除了逐一取出的功能之外,我們也經常會被其中的元素加以排序。在PHP程式語言中,要排序陣列中的元素順序主要有以下幾個函數可以使用:

函數名稱說明
sort()針對一般陣列變數進行遞增排序
rsort()針對一般陣列變數進行遞減排序
asort()針對關聯式陣列(字典)變數的值進行遞增排序
ksort() 針對關聯式陣列(字典)變數的鍵進行遞增排序
arsort() 針對關聯式陣列(字典)變數的值進行遞減排序
krsort() 針對關聯式陣列(字典)變數的鍵進行遞減排序

以下這個例子示範了對於字串陣列的2種不同排序方式:

<?php
    $brands = array('Toyota', 'BMW', 'Benz', 'Lexus', 'Nissan', 'Chrysler');
    echo "<h3>Before sorting:</h3>";
    foreach($brands as $brand) echo "$brand<br/>";
    sort($brands);
    echo "<h3>After sorting(sort):</h3>";
    foreach($brands as $brand) echo "$brand<br/>";
    rsort($brands);
    echo "<h3>After sorting(rsort):</h3>";
    foreach($brands as $brand) echo "$brand<br/>";    
?>

以下是執行的結果(在瀏覽器上看起來的樣子):

如果是數字陣列的內容,也可以利用同樣的函數來進行排序。至於關聯式陣列,也就是字典陣列,其範例如下:

<?php 
	$scores = array("Tom"=>90, "Mary"=>74, "Lisa"=>43, "Richard"=>100);
	echo "<h3>Sorting the score:</h3>";
	asort($scores);
	foreach ($scores as $name=>$score) echo "$name:$score<br/>";
	echo "<h3>Sorting the name:</h3>";
	ksort($scores);
	foreach ($scores as $name=>$score) echo "$name:$score<br/>";
?>

上述程式碼之執行結果如下:

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s