陣列

根據目前我們學到的,存資料就要用變數,但變數只能一次存一個資料

而陣列是一種可以一次儲存非常多個變數的資料結構,而且除了一維陣列之外,還可以寫成多維陣列,儲存更多的値。

陣列大家可以想像成是一個很大的空間,能夠放得下無數個盒子(元素,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輸出就什麼都沒有)
?>

results matching ""

    No results matching ""