Board logo

標題: [教學] (PHP+IIS+MsSQL教學第11篇) 多維陣列 [打印本頁]

作者: 小誌    時間: 2010-5-13 19:02     標題: (PHP+IIS+MsSQL教學第11篇) 多維陣列

多維陣列
多維陣列(Multi-dimensional),陣列中還有陣列就稱之多維陣列,我們之前所說明的是一維陣列,因為我們只指定了一個陣列個數索引,如果我們指定了兩個陣列個數索引,那這個陣列就成為二維陣列,若如果我們指定了三個陣列個數索引,那這個陣列就成為三維陣列,以此類推。

二維陣列的宣告
一維陣列是只有一行的資料排列,而二維陣列的資料排列就如同表格一般,分為「行」與「列」:
[attach]366[/attach]

所以,我們要使用二維陣列時,就要如下列方式來初始:
標準陣列初始格式
  1. $陣列名稱[X][Y]=初始值;
複製代碼
上式中:「X」為「列」的大小;「Y」為「行」的大小。
例如: 初始一個3x2的二維陣列
  1. $Myarray[0][0]="小誌";
  2. $Myarray[0][1]="egge";
  3. $Myarray[1][0]="chiey";
  4. $Myarray[1][1]="connie";
  5. $Myarray[2][0]="小魚";
  6. $Myarray[2][1]="小和";
複製代碼
注意喔!宣告一個3x2的二維陣列,其列的最大註標應該為2行的最大註標應該是1才對喔!其中列元素是0~2共三個,行元素則是0~1共兩個:
[attach]367[/attach]


假設我們有一個學生成積表格如下圖,請以二維陣列方式儲存表格內資料:
[attach]368[/attach]

要將表格資料轉換成陣列形式,我們可以這樣做:
  1. $Student[0][0]=”姓名”; //‘將第一列第一行的資料指定為”姓名”
  2. $Student[0][1]=”國文”; //將第一列第二行的資料指定為”國文”
  3. 以下略…
複製代碼
就是以逐個元素資料填入的方式,茲將元素註標對照如下圖;
[attach]369[/attach]


array()函數亦可應用於二維陣列的初始,做法是:將「列」視為一維陣列,而此一「列」陣列的元素則為「行」陣列,以學生成績表來說:
  1. $Student=array(
  2. "0"=>array(0=>"姓名",1=>"國文",2=>"英文",3=>"數學"),
  3. "1"=>array(0=>"小誌",1=>100,2=>90,3=>80),
  4. "2"=>array(0=>"得華",1=>60,2=>100,3=>70),
  5. "3"=>array(0=>"亭封",1=>90,2=>80,3=>90),
  6. "4"=>array(0=>"學有",1=>65,2=>90,3=>80));
複製代碼
當然,對於非連續註標的二維陣列或是字串註標陣列,使用array()函數也是行的通的,例如:
  1. <?
  2. $Student=array(
  3. "小誌"=>array("a"=>100,2=>90,"b"=>80),
  4. "得華"=>array(1=>60,"c"=>100,3=>70),
  5. "亭封"=>array("d"=>90,2=>80,"e"=>90));
  6. ?>
複製代碼
上例等同:
  1. $Student["小誌"]["a"]=100;
  2. $Student["小誌"][2]=90;
  3. $Student["小誌"]["b"]=80;

  4. $Student["得華"][1]=60;
  5. $Student["得華"]["c"]=100;
  6. $Student["得華"][3]=70;

  7. $Student["亭封"]["d"]=90;
  8. $Student["亭封"][2]=80;
  9. $Student["亭封"]["e"]=90;
複製代碼

作者: 小誌    時間: 2010-5-13 19:06

二維陣列的存取
要存取二維陣列元素的資料很簡單,就如同處理一維陣列,不過,我們必須同時指定元素的列註標與行註標,例如:
  1. $Myarray [0][1] = 999;  //將資料存放置陣列位置[0][1]中
  2. $Myarray[1][2] = 888;  //將資料存放置陣列位置[1][2]中
  3. //取出陣列位置[0][1]與[1][2]的資料相減,並存至陣列位置[3][3]中
  4. $Myarray[3][3]= $Myarray[0][1]- $Myarray[1][2];
複製代碼
如果要以迴圈敘述來存取二維陣列的資料,則必須使用巢狀的迴圈,我們以for巢狀迴圈輸出二維陣列內的資料來說明:
[attach]370[/attach]
  1. <HTML>
  2. <HEAD>
  3. <TITLE>ex04_13</TITLE>
  4. </HEAD>
  5. <BODY>
  6. <?
  7. $Student=array(
  8. "0"=>array(0=>"姓名",1=>"國文",2=>"英文",3=>"數學"),
  9. "1"=>array(0=>"小誌",1=>100,2=>90,3=>80),
  10. "2"=>array(0=>"得華",1=>60,2=>100,3=>70),
  11. "3"=>array(0=>"亭封",1=>90,2=>80,3=>90),
  12. "4"=>array(0=>"學有",1=>65,2=>90,3=>80));
  13. ?>
  14. <table border=1>
  15. <?
  16. $i=count($Student);
  17. for($x=0;$x<$i;$x++)
  18. {
  19.   echo "<tr>";
  20.   $j=count($Student[$x]);
  21.   for ($y=0;$y<$j;$y++)
  22.    {
  23.    echo ("<td>" . $Student[$x][$y] . "</td>");
  24.    }
  25.   echo "</tr>";
  26. }
  27. ?>
  28. </table>
  29. </BODY></HTML>
複製代碼
對於連續註標的二維陣列使用巢狀for迴圈可以輕易的解決,但是若對於非連續註標或字串註標的陣列就行不通了,此時要改用巢狀的foreach迴圈才能解決,例如:
  1. <HTML>
  2. <HEAD>
  3. <TITLE>ex04_14</TITLE>
  4. </HEAD>
  5. <BODY>
  6. <table border=1>
  7. <?
  8. $Student=array(
  9. "小誌"=>array("a"=>100,2=>90,"b"=>80),
  10. "得華"=>array(1=>60,"c"=>100,3=>70),
  11. "亭封"=>array("d"=>90,2=>80,"e"=>90));

  12. foreach ($Student as $key=>$value)
  13. {
  14. echo "<tr>";
  15. foreach ($value as $key1=>$value1)
  16. {
  17. echo "<td>元素註標: $key,$key1 ; 元素值: $value1 </td>";
  18. }
  19. echo "</tr>";
  20. }
  21. ?>
  22. </table>
  23. </BODY></HTML>
複製代碼
[attach]371[/attach]
作者: 小誌    時間: 2010-5-13 19:16

陣列排序
要對陣列元素的資料加以順序排列,不需要我們自己轉寫程式敘述,直接使用PHP所提供的函數即可:


sort()函數
sort()函數可根據字母順序或數值大小加以排序:
  1. <?
  2. $X[0] ="tw";
  3. $X[1] ="com";
  4. $X[2] ="net";
  5. $X[3] ="gov";

  6. sort($X);
  7. foreach ($X as $key=>$value)
  8. {
  9. echo "元素 $key;元素值 $value <br>";
  10. }
  11. ?>
複製代碼
當上例執行後網頁出現如下:
[attach]372[/attach]


asort()函數
sort()函數對陣列元素排序後,則陣列中的元素註標索引將會被重新編排,如下例:
  1. <?
  2. $X[252] ="com";
  3. $X[20] ="gov";
  4. $X[100] ="net";
  5. $X[] ="tw";

  6. sort($X);
  7. foreach ($X as $key=>$value)
  8. {
  9. echo "元素 $key;元素值 $value <br>";
  10. }
  11. ?>
複製代碼
當上例陣列被sort()函數排序元素後,陣列元數的註標與元素值的關係如下圖所示:
[attach]373[/attach]

倘若,要陣列進行元素排序,又要保留元素原有的註標索引,則必須使用asort()函數進行排序:
  1. <?
  2. $X=array("charles" => "小誌",
  3.          "connie" => "無尾熊",
  4.          "chiey" => "小魏",
  5.          "egge" => "小魚");

  6. asort($X);
  7. foreach ($X as $key=>$value)
  8. {
  9. echo "元素 $key;元素值 $value <br>";
  10. }
  11. ?>
複製代碼
上例結果如下圖,元素已經加以排序,但也保留了元素原來的註標索引值:
[attach]374[/attach]


rsort()函數與arsort()函數
sort()函數是對陣列元素正向排序,而rsort()函數則對陣列元素進行逆向排序,現在以相同的陣列使用rsort()排序:
  1. <?
  2. $X[252] ="com";
  3. $X[20] ="gov";
  4. $X[100] ="net";
  5. $X[] ="tw";

  6. rsort($X);
  7. foreach ($X as $key=>$value)
  8. {
  9. echo "元素 $key;元素值 $value <br>";
  10. }
  11. ?>
複製代碼
由上例中您會發現,rsort()函數會對陣列元素逆向排序,同時也將元素的原始註標索引重新編排了!
[attach]375[/attach]

若要對陣列元素逆向排序,但不重新編排元素的原始註標索引,則必須使用arsort()函數來排序:
  1. <?
  2. $X[252] ="com";
  3. $X[20] ="gov";
  4. $X[100] ="net";
  5. $X[] ="tw";

  6. arsort($X);
  7. foreach ($X as $key=>$value)
  8. {
  9. echo "元素 $key;元素值 $value <br>";
  10. }
  11. ?>
複製代碼
[attach]376[/attach]

ksort()函數
之前介紹的sort()、asort()、rsort()、arsort()函數,不管是正向或逆向都是對陣列元素排序,而ksort()函數則對陣列「註標」排序,現在以相同的陣列使用ksort()排序:
  1. <?
  2. $X=array("charles" => "小誌",
  3.          "connie" => "無尾熊",
  4.          "chiey" => "小魏",
  5.          "egge" => "小魚");

  6. ksort($X);
  7. foreach ($X as $key=>$value)
  8. {
  9. echo "元素 $key;元素值 $value <br>";
  10. }
  11. ?>
複製代碼
[attach]377[/attach]




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