陣列
根據目前我們學到的,存資料就要用變數,但變數只能一次存一個資料
而陣列是一種可以一次儲存非常多個變數的資料結構,而且除了一維陣列之外,還可以寫成多維陣列,儲存更多的値。
陣列大家可以想像成是一個很大的空間,能夠放得下無數個盒子(元素,element),每個盒子能夠存任意資料型別的資料(值,value),而每個盒子都有一把鑰匙(鍵、索引,key),需要打開盒子才能夠取得資料,但一個這個空間裡面,一把鑰匙只能對應到一個盒子,否則要開盒子時會不知道要開哪一個才對
PHP陣列的架構可以是單純的數個値,也可以由 key 與 value 的搭配組成
其中 key 可以看成是變數(可以自己設定),而 value 則是由藉由key所儲存的値
PHP Array 陣列語法
<?php
$one_array = array (
key => value ,
key => value ,
key => value , ......
);
//或是可以這樣寫,php 5.4 版後,下列語法也是合法的
$one_array = [ key=>value , key=>value , key=>value , ...];
?>
$one_array
為自定義的陣列變數名稱
array()
這個函數小括號內的每一個項目為一個陣列元素(element),每個元素都有一組「鍵值對(key-value pair)」,若有超過一個元素, 元素與元素之間要以,
逗號分隔
key(鍵、索引)
的內容要是一個整數或是字串
value(值)
的內容可以是任意型別的資料
一般的陣列舉例如下 ( 假設我們要設定台灣郵遞區號對應到縣市) ,就像這樣:
<?php
$zipcode = array ('100'=>'台北市中正區','952'=>'蘭嶼' , '200'=>'基隆市仁愛區' ,'640' =>'斗六' );
//php 5.4 版後,下列語法也是合法的
$zipcode = ["100"=>"台北市中正區","952"=>"蘭嶼" , "200"=>"基隆市仁愛區" ,"640" =>"斗六" ];
?>
那怎麼存取與使用陣列呢?
我們會用中括號[key(鍵、索引)]
來存取陣列,拿到相對應的值(value)
<?php
$zipcode = ["100"=>"台北市中正區","952"=>"蘭嶼" , "200"=>"基隆市仁愛區" ,"640" =>"斗六" ];
echo $zipcode["100"]; //output:台北市中正區
echo $zipcode["640"]; //output:斗六
$arr = [ '1台北' => '台北市','2新北'=>'新北市','3桃園'=>'桃園縣/市'];
echo $arr['1台北']; //output:台北市
echo $arr['3桃園']; //output:桃園縣/市
$nums = [1 => 'X' , 2 => 'Y' , 3 => 'Z'];
echo $nums[2]; //output:Y
echo $nums[3]; //output:Z
?>
索引值(key)強制轉換
上面有說到,key(鍵、索引)
的內容要是一個整數或是字串,那如果我給的key的資料型別不是整數或是字串呢?
這時候如果索引值符合下列情況,將會被強迫轉換
- 合法的十進位整數字串 強迫轉換成 整數
$a=['8' => 'x']
,會被強迫轉成$a=[8 => 'x']
,但是['08']
不會被強迫轉換,因為0開頭是八進位
- 浮點數 強迫轉換成 整數
$a=[2.3 => "y"]
,會被強迫轉成$a=[2 => "y"],
小數部分會被無條件捨去
- 布林值 會被強迫轉換 整數
如索引若為true實際會被儲存為1而索引false會被儲存為 0,所以
$a=[true => 'a' , false => 'b']
會被強迫轉成$a=[1 => 'a' , 0 => 'b']
- Null 會被強迫轉換為 空字串
$a=[null => 'z']
會被強迫轉成$a=["" => 'z']
,即若索引為 null 實際會被儲存為 ""
定義時重複使用索引值(key)
如果在定義陣列中多個單元都使用了同一個索引值 (key),則只會保留使用最後一筆,之前的都會被覆蓋掉。
舉例來說
<?php
//陣列之 索引值(key)若有多個相同數值,則僅會保留該數值的最後一筆
$x = [1 =>'aa' , 1 => 'bb' , 2 => 'cc' , 3 => 'dd' , 3 => 'ee', "1" => 'ff'];
var_dump($x);
?>
var_dump($x)
是用來顯示變數的相關訊息,包括表達式的資料類型與值。陣列展開值等等資訊有類似用法的函數還有
print_r($x)
,但print_r($x)
不會顯示資料類型
會顯示以下訊息(已加上註解和排版過)
array(3) {
[1]=> string(2) "ff" //string型別,2個字元,內容是"ff"
[2]=> string(2) "cc" //string型別,2個字元,內容是"cc"
[3]=> string(2) "ee" //string型別,2個字元,內容是"ee"
}
短陣列(省略陣列索引)
陣列的索引(key)可以自行指定,也可以省略,但如果沒有自己指定,PHP將會由0開始依序遞增自動產生索引(key)
定義短陣列的語法如下
<?php
$one_array = array ( value1,value2,value3,...);
//也可以寫成
$one_array = [value1,value2,value3,...];
?>
首先先看這個例子
<?php
$array = ['v1','v2','v3',4,5,6.1,true,null];
var_dump($array);
?>
由於PHP的陣列可以裝任意資料型別的資料,所以我們將目前有學過的主要資料型別都放了進去
var_dump($x)
是用來顯示變數的相關訊息,包括表達式的資料類型與值。陣列展開值等等資訊有類似用法的函數還有
print_r($x)
,但print_r($x)
不會顯示資料類型
這個例子會顯示以下的資訊(已排版過)
array(8) {
[0]=> string(2) "v1" //string型別,2個字元,內容是"v1"
[1]=> string(2) "v2" //string型別,2個字元,內容是"v2"
[2]=> string(2) "v3" //string型別,2個字元,內容是"v3"
[3]=> int(4) //int型別,內容是4
[4]=> int(5) //int型別,內容是5
[5]=> float(6.1) //float型別,內容是6.1
[6]=> bool(true) //bool型別,內容是6.1
[7]=> NULL //NULL型別,無內容
}
array(8)
代表這個陣列裡面有8個元素(element),{}
內就是分別是8個元素(element),[]
內代表的數字是元素的索引(key),=>
後面的是該元素所儲存值的資料型別以及值的內容
那麼短陣列該怎麼存取與使用陣列呢?
就是使用PHP幫我們產生的[0]
或是[1]
來存取陣列
<?php
$array = ['v1','v2','v3',4,5,6.1,true,null];
echo $array[1]; //output:v2
echo $array[3]; //output:4
echo $array[5]; //output:6.1
echo $array[6]; //output:1(true輸出會自動轉成1)
echo $array[7]; //output:(null輸出就什麼都沒有)
?>