2018年12月8日 星期六

DW_PHP_AJAX_CH2 PHP語言入門_(2)變數、符號與陣列_陣列

[陣列]  

什麼叫陣列(Array)?陣列就是一個集合變數, 陣列就如變數一般, 可用來儲存資料, 一般的變數只能存放一筆資料, 而陣列則可以存放多筆資料, 簡言之, 陣列就一群資料型態相同的變數集合。 陣列是一群變數的集合, 不妨將陣列想像成一間旅館, 旅館內會有很多房間可以讓旅客居住, 相對於我們的程式而言, 這些房間就是變數, 旅客則是我們的資料。 旅館的房間有所謂的房間號碼, 相對於我們的陣列, 這些房間號碼就是所謂的『index(索引、註標)』。 <<初始陣列>> 使用陣列之前必須先進行初始的程序, 與變數宣告相同:
$陣列名稱[]=初始值;
例如:
$X[] ="com";
$X[] ="gov";
$X[] ="net";
$X[] ="tw";
$X[] ="int";
上例中:因為我們沒有特別指定陣列中的元素註標值, 因此陣列X為採用預設的註標索引編號, 可存放之資料最大註標(即陣列的大小-1)為4。 完成陣列的宣告後, 我們就可以存取陣列中每一個位置的資料, 例如:
$Myarray[0] = 999;  //將資料存放置陣列位置0中
或是:
$Myarray[0] = 999  //將資料存放置陣列位置0中
$Myarray[1] = 888  //將資料存放置陣列位置1中
//出陣列位置0與1的資料相減, 並存至陣列位置2中
$Myarray[2] = $Myarray[0]- $Myarray[1]

『陣列位置』就是所謂的陣列『註標(subscript、index)』, 而陣列中所存放的每項資料稱之為『元素(element)』, 『註標』是我們存取陣列資料的依據, 例如我們有一個大小為5(五個資料項存放空間)的陣列, 則該陣列就有『0、1、2、3、4』5個註標: 陣列於建立之時, 若不同時指定陣列元素的初始值, 此時, 可透過『array()』函數將多項資料存放於變數中, 使變數轉換為陣列(不需要個別指定陣列元素), 同時, 所指定存放的多項資料將成為陣列中的元素值:
$陣列名稱=array(資料1,資料2,資料3…);
例如:
$testArray=array("你","我","他");
此時, testArray就是一個大小為3的陣列, 其含有3個元素, 而註標編號為0、1、2, 註標編號1的元素存放資料『你』, 註標編號2的元素存放資料『我』, 註標編號2的元素存放資料『他』。

 <<陣列的使用>>

 不可一次指定陣列內的元素資料值, 例如:
//逐個元素指定
$Myarray[0] = 999;
$Myarray[1] = 999;
$Myarray[2] = 999;
$Myarray = 999;  //錯誤, 不可一次指定陣列內的元素資料值
在上例中, 已透過逐個元素指定的方式建立陣列Myarray, 但是又使用『$Myarray = 999;』敘述指定Myarray, 此時原先的陣列Myarray已經消失而變成變數Myarray。 不可一次讀取陣列內的元素資料值, 例如:
$Myarray = Array(3,6,9);
echo $MyArray ; //錯誤
要讀出陣列元素資料值, 必須逐項讀出:
$Myarray = array("春天","夏天","秋天","冬天");
echo $Myarray [0];  //印出春天
echo $Myarray [1];  //印出夏天
echo $Myarray [2];  //印出秋天
echo $Myarray [3];  //印出冬天
還好, 陣列元素只有四個, 如果有40個, 那可得寫40行敘述才能將陣列內的元素資料全部列印出來!可是, 總會遇到元素很多的時候吧!那就可以配合迴圈敘述來做, 例如用for迴圈來列印出全部的陣列資料:
$Myarray = array("春天","夏天","秋天","冬天");
for ($I=0 ; $I<=3 ; $I++)
{
echo "$Myarray[$I] . 
";
}
存取陣列資料不可超過註標範圍。
//宣告4個元素的陣列, 註標由0至3
$Myarray = array("春天","夏天","秋天","冬天");
echo $Myarray[5];  //錯誤
echo $Myarray[-1];  //錯誤
建立陣列後, 可以直接使用count()函數得知陣列的大小(長度), 我們只要將count()函數得知的陣列大小減1就是陣列元素的最大註標。 例如:
$Myarray = array(3,6,9);
echo (count($Myarray)); //列印出陣列大小3
echo (count($Myarray)-1); //列印出最大陣列註標2
例如:
$Myarray = array("春天","夏天","秋天","冬天");
for ($I=0 ; $I";
}
在上例中, 將count()函數放在for迴圈敘述的測試條件中, 雖然敘述簡短, 但卻是不智之舉, 因為迴圈每次執行時都得呼叫一次count()函數, 造成程式執行效率不佳, 所以應把count()函數提出迴圈外利用:
$Myarray = array("春天","夏天","秋天","冬天");
$num=count($Myarray);
for ($I=0 ; $I<$num ; $I++)
{
echo "$Myarray[$I] 
";
}

<<非連續註標陣列>>

 在初始陣列並給定陣列元素值時, 則元素註標會自動的從0開始編號, 每增加一個元素時, 註標編號自動依序遞增, 而成為連續註標陣列。 有時候, 或許需要以跳號的方式來編排註標, 那就可以在初始陣列時給予任何整數的註標指定, 這就是非連續註標陣列:
$X[10] ="com";
$X[20] ="gov";
$X[50] ="net";
$X[100] ="tw";
$X[160] ="int";
若已經指定了非連續註標陣列, 接著又增加了一個沒有指定註標編號的元素時, 則此元素的註標會被設定為現有陣列元素中最高索引註標編號加1:
$X[252] ="com";
$X[20] ="gov";
$X[100] ="net";
$X[] ="tw"; //元素註標為252+1253
當使用標準的for迴圈敘述來輸出陣列內全部的元素時, 必須指定for迴圈的計數變數初值與終止條件, 這對於連續註標陣列是可行的, 但是對非連續註標陣列可就行不通了, 因為非連續註標陣列的元素註標示隨意亂跳的, 因此, 就必須透過『foreach』迴圈敘述來替代for迴圈敘述:
foreach(陣列 as $value)
{
     敘述區塊;
}
例如:
<?php
$X[252] ="com";
$X[20] ="gov";
$X[100] ="net";
$X[] ="tw";

foreach ($X as $value)
{
 echo "$value <br>";
}
?>
上例中的『$value』只是一個暫存變數, 用來臨時裝載陣列中的元素資料值, 迴圈每執行一次, 『$value』暫存變數的內容就存放不同註標編號內的元素資料值。

 <<字串註標陣列>> 

字串註標陣列其實也是非連續註標陣列, 通常陣列的註標索引都會以整數來作為識別編號, 但PHP中允許我們以字串來作為註標識別索引:
<?
$Myarray["charles"] = "庭碩";
$Myarray["egge"] = "土吉";
$Myarray["chiey"] = "宇熙";
$Myarray["connie"] = "宜靜";

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

foreach ($Myarray as $value)
{
 echo "$value <br>";
}
?>
通常是不需要使用到元素的註標值的, 但如果使用字串註標陣列, 想必使用到註標值的機會就比較大了, 標準的foreach迴圈敘述就不夠用了, 這時候可以使用進階的foreach迴圈敘述:
foreach(陣列 as $key => $value)
{
     敘述區塊;
}
上式中的『$value』只是一個暫存變數, 用來臨時裝載陣列中的元素資料值, 而『$key』也是一個暫存變數, 用來臨時裝載陣列中的元素註標, 例如:
<?php
$Myarray=array("charles" => "庭碩",
               "egge" => "小魚",
               "chiey" => "宇熙",
               "connie" => "宜靜");

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

沒有留言:

張貼留言