[基礎課程] PHP 陣列變數

陣列是一種結構性的資料儲存空間,可以儲存多筆資料到一個陣列內,分別由不同的元素做對應位置。請開始在 Web 目錄下新增檔案 2_array.php,為了簡化程式碼結構將不建置 HTML 基本結構。請開始做 PHP 各種練習並預覽網頁結果。


基礎的 array 陣列

陣列內每個元素包含了索引值跟內容值,提供尋找跟讀取。簡單來說,以前學的變數只能指定一個值。但如果是陣列型態的變數,就能多個變數且沒有侷限。可以建議初學者,在學習陣列會以火車列車廂串接作為假想情境。

練習:跟著做理解 array

<?php
$aa[5]="1";
$aa[]="2";
$aa[]="3";
$aa[]="4";
// print_r($aa);
echo $aa[8].'<br/>'; //print 第 8 格變數
?>

陣列的說明如下:

  1. 單看陣列變數的單一元素內,分別是 key(索引)跟 value(內容)。索引預設以數字從 0 開始。
  2. 同一陣列 [] 內,初次未填時預設為 0(除非有指定),之後每加入新元素會自動遞增數字做索引。
  3. 列印陣列的方式使用 print_r() 函數。
  4. 當你需要顯示某一個資料時,需要透過索引值來找到該元素位置才能存取內容。

練習:跟著做

//可以儲存字串,索引也可以用文字來命名
$ab["cat"] ="加菲貓";
$ab["dog"] ="史努比";
$ab[] ="黑色"; //索引為 0
$ab[] ="白色"; //索引為 1
// print_r($ab);
echo $ab["dog"].'<br/>'; //輸出索引為 dog 的變數
echo $ab[1].'<br/>'; //print 索引為 1 的變數

到目前為止,你應該知道一個陣變數列如何塞連續多個值,同時也能知道索引命名能夠幫助之後存取使用。

接著練習:跟著做

<?php
$animal="cat";
echo "[] 裡面可以用變數,不一定用字串=>".$ab[$animal];
?>

我們可以用變數來找索引,不一定要固定文字。


二維的陣列

現在知道一個變數 A 使用陣列型態,每個元素可以塞資料。如果這個元素所塞的資料又是一個陣列型態呢?思考一下,用以下不同概念做解說:

  1. 以火車列車來說該某車廂內又塞了一個火車列車。這個車廂內火車也是有很多車廂可以放資料。
  2. 以二維表格來說,垂直列是指陣列各元素,橫向列是指單元素內之陣列各元素

練習:跟著做

<?php
// 二維陣列,一個元素空間內可以再塞一個陣列,形成二維空間
$ac[1][]="a";
$ac[1][]="b";
$ac[2][]="c";
$ac[3][]="d";
$ac[2][]="e";
// print_r($ac);
echo $ac[1][1].'<br/>'; //print b
echo $ac[2][1].'<br/>'; //print e
echo "<br>";
// print_r($ac[1]);
?>

Foreach 迴圈存取陣列

foreach 是迴圈的一種,是提供陣列進行連續取出的行為動作。語法為

foreach ($variable as $key => $value) {
#code...
}

也就是將一個變數(陣列型)根據這個陣列長度依序取出元素,而在該迴圈單趟下,取出的元素會以 $key$value 做臨時變數,$key 可以省略不寫。

練習:跟著做

<?php
foreach($aa as $x) //循序抽取,每次用$x 儲存起來
echo $x.'<br/>'; //print 1, 2, 3, 4
?>
<hr>
<?php
foreach ($ab as $key => $value)
echo "this ".$key."'s name is \"".$value.'"<br>';
?>

透過上面舉例,foreach 可以自動的將每一格元素抽取出來並暫存到索引變數(可省略)與資料變數。

練習:二維陣列的循序抽取

<?php
foreach ($ac as $one => $ary) {
echo "\$ac[".$one."] 裡面有。...";
foreach ($ary as $value) {
echo $value; //print c,e
}
echo "<br/>";
}
?>
<hr/>
<?php
foreach ($ac[2] as $x)
echo $x . '<br/>'; //print c,e
?>

當二維陣列要全部存取時,就是用兩次 foreach 來循序抽取。第一次抽取外面的陣列個元素,第二次抽取這個外面元素的裡面所有抽取。也就是跑了 N*N 次迴圈。如果很肯定要找某單一個元素下的陣列,也能直接指定該元素,就不需要做兩個 foreach() 浪費效能與迴圈次數。

以上課題之完整代碼: view full code