---
# System prepended metadata

title: 【Lua 筆記】陣列 - part 5
tags: [Lua, 程式語言]

---

【Lua 筆記】陣列 - part 5
===

目錄（Table of Contents）：

[TOC]

---

由於有款遊戲叫做 CSO（Counter-Strike Online），內建模式創世者模式（Studio）新增使用 Lua 及其遊戲的 API，所以突發奇想製作這個筆記。

這個筆記會在一開始先著重純粹的程式設計自學，在最後的章節才會與 CSO 遊戲 API 進行應用。

陣列（Array）
---

我們先來看看 Lua 的陣列長怎樣：

```lua=
myArray = {10, 20, 30, 40, 50}
```

陣列（Array），用兩個大括號 `{}` 將資料圍起來，在 Lua 當中並沒有給它特定的資料型態，而是被一個稱為 table（表）的資料型態所包圍起來。

所以 type(myArray) 輸出結果會是 table：

```lua=
myArray = {10, 20, 30, 40, 50}
print(type(myArray)) --> table
```

:::danger
切記：Lua 的陣列索引從 1 開始。也可以自定義從 0 開始，等下會說怎麼做。
:::

回歸到問題本身，各位可能仍然還會疑惑的一點是，陣列到底是啥？

陣列你也可以想像成是數學上的「數列」，而剛剛說的索引，其實就是數列當中，數字的「位置」編號。

以 myArray = {10, 20, 30, 40, 50} 為例：

是一個長度為 5 的陣列，陣列裡面的 10 的索引值是 1，40 的索引值是 4。

### 擷取陣列值
---

```lua=
myArray = { 10, 20, 30, 40, 50 }
print(myArray[1]) --> 10
print(myArray[2]) --> 20
print(myArray[3]) --> 30
```

擷取陣列值很簡單，只需要打上陣列的變數名稱（myArray），加上 [] 兩個左右中括號，裡面填上各個數字的位置（索引值：index）即可。

不過這樣似乎太麻煩了，所以我們可以運用 for 迴圈幫我們完成這件事情：

```lua=
myArray = { 10, 20, 30, 40, 50 }
for i = 1, 3 do
  print(myArray[i])
end
```

輸出結果：

```
10
20
30
```

### 計算陣列長度
---

計算陣列長度，我們可以使用 `#` 運算子，使回傳陣列的長度（意即得知陣列的元素個數）。

註：以 myArray = {10, 20, 30, 40, 50} 為例，10、20、30 這些被稱為陣列當中的元素（element）。

```lua=
myArray = { 10, 20, 30, 40, 50 }
print(#myArray) --> 5
```

透過計算陣列長度，我們能夠使用 for 迴圈來幫我們完成「遍歷」陣列這件事情。

註：遍歷（traversal），簡單來說就是從頭到尾一個一個拜訪、跑過一遍。以陣列而言就是從第一個元素跑到最後一個。

```lua=
myArray = { 10, 20, 30, 40, 50 }
for i = 1, #myArray do
  print(myArray[i])
end
```

輸出結果：

```
10
20
30
40
50
```

不過習慣上，筆者通常會寫成這樣：

```lua=
myArray = { 10, 20, 30, 40, 50 }
length = #myArray
for i = 1, length do
  print(myArray[i])
end
```

筆者習慣使用變數儲存值，因為方便的緣故，不用每次打上原文（#myArray）。

### 陣列索引值問題
---

我們將 i = 1，改成 i = 0 看看執行起來會怎樣：

```lua=
myArray = { 10, 20, 30, 40, 50 }
for i = 0, #myArray do --> 將 i = 1 改成 i = 0
  print(myArray[i])
end
```

輸出結果：

```
nil
10
20
30
40
50
```

多了一個 nil，因為我們沒有設定索引 0 的陣列值，所以 lua 他找不到，回傳值就是空。

寫成以下這樣，設定索引 0 的值：

```lua=
myArray = { 10, 20, 30, 40, 50 }
myArray[0] = 0
for i = 0, #myArray do
  print(myArray[i])
end
```

輸出結果：

```
0
10
20
30
40
50
```

也可以將索引改成負數喔！這部分就請自行練習～

### 二維陣列（Two dimensional Arrays）
---

二維陣列，顧名思義，就是陣列裡面還有一個陣列：

```lua=
myArray = {{1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15}}
```

這樣的寫法完全沒問題喔！而且應用在很多地方，例如像是高中數學的矩陣運算（矩陣乘法、加法、鏡射矩陣等），以及顯示卡繪圖應用。

以下是遍歷二維陣列的程式碼：

```lua=
myArray = {{1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15}}

for i=1, #myArray do
  for j=1, #myArray[i] do
    print(myArray[i][j])
  end
end
```

輸出結果：

```
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
```

以上的 for 迴圈屬於巢狀迴圈，說明一下～：

- i = 1 時，直接進入下一層迴圈 j = 1 ~ #myArray[i] 的循環。
- i 要變成 2 之前，必須要等 j 這個內層迴圈跑完才可以。
- 以此類推。

總結
---

陣列（Array），在 Lua 當中並沒有給它特定的資料型態，而是被一個稱為 table（表）的資料型態所包圍起來。

:::danger
切記：Lua 的陣列索引從 1 開始。也可以自定義從 0 開始。
:::

陣列你也可以想像成是數學上的「數列」，而剛剛說的索引，其實就是數列當中，數字的「位置」編號。

擷取陣列值：myArray[index]，擷取 index 位置上的資料。

計算陣列長度：用 `#` 運算子，使回傳陣列的長度（意即得知陣列的元素個數）。

例：#myArray

Lua 陣列的索引是可以自定義的，例如：

myArray[0] = 0

也可以是負數。

二維陣列，顧名思義，就是陣列裡面還有一個陣列：

```lua=
myArray = {{1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15}}
```

參考資料
---

[Lua 数组 | 菜鸟教程](https://www.runoob.com/lua/lua-arrays.html)

[【30天Lua重拾筆記19】基礎3: 陣列從1開始 | 又LAG隨性筆記](https://www.lagagain.com/post/30%E5%A4%A9lua%E9%87%8D%E6%8B%BE%E7%AD%86%E8%A8%9819%E9%99%A3%E5%88%97%E5%BE%9E1%E9%96%8B%E5%A7%8B/)