PHP 中的數組實際上是一個有序映射。映射是一種把 values 關聯到 keys 的類型。此類型針對多種不同用途進行了優化;它可以被視為數組、列表(向量)、哈希表(映射的實現)、字典、集合、堆棧、隊列等等。本篇文章將記錄數組的學習過程。
一、創建數組
二、訪問數組
1、數組解包
2、遍歷數組
三、操作數組
1、添加數組項
2、修改數組項
2.1、在 foreach 循環中修改數組項
3、刪除數組項?
四、多維數組
1、二維數組?
五、數組函數
一、創建數組
可以用 array() 語言結構來新建一個 array。它接受任意數量用逗號分隔的 鍵(key) => 值(value) 對。
array(key => value,key2 => value2,key3 => value3,...
)
鍵(key)不是必需的,最后一個數組單元之后的逗號可以省略。
可以用短數組語法 [] 替代 array() 。
?示例 一個簡單的數組
$array = array("foo" => "bar","bar" => "foo",
);// 使用短數組語法
$array = ["foo" => "bar","bar" => "foo",
];
?鍵(key)可以是 integer 或者 string。value 可以是任意類型。
此外 key 會有如下的強制轉換:
- String 中包含有效的十進制 int,除非數字前面有一個 + 號,否則將被轉換為 int 類型。例如鍵名 "8" 實際會被儲存為 8。另外, "08" 不會被強制轉換,因為它不是一個有效的十進制整數。
- Float 也會被轉換為 int ,意味著其小數部分會被舍去。例如鍵名 8.7 實際會被儲存為 8。
- Bool 也會被轉換成 int。即鍵名 true 實際會被儲存為 1 而鍵名 false 會被儲存為 0。
- Null 會被轉換為空字符串,即鍵名 null 實際會被儲存為 ""。
- Array 和 object 不能被用為鍵名。堅持這么做會導致警告:Illegal offset type。
如果在數組定義時多個元素都使用相同鍵名,那么只有最后一個會被使用。
示例 類型轉換與覆蓋
$array = array(1 => "a","1" => "b",1.5 => "c",true => "d",
);
var_dump($array);
輸出
array (size=1)1 => string 'd' (length=1)
上述示例中所有的鍵名都被強制轉換為 1,則每一個新單元都會覆蓋前一個的值,最后剩下的只有一個 "d"。
PHP 數組可以同時含有 int 和 string 類型的鍵名,因為 PHP 實際并不區分索引數組和關聯數組。
PHP 數組可以同時含有 int 和 string 類型的鍵名,因為 PHP 實際并不區分索引數組和關聯數組。
索引數組:在索引數組中,每個項目都有一個索引號。默認情況下,第一個項目的索引是 0,第二個項目的索引是 1,依此類推。(Java中的數組就屬于索引數組)
關聯數組:是使用分配給它們的命名鍵的數組。(類似Java中的Map)
PHP 中的數組和其它編程語言中的數組并不完全一樣,這一點需要注意。
示例 混合 int 和 string 鍵名的數組?
$array = array("foo" => "bar","bar" => "foo",1 => -1,-1 => 1,
);
var_dump($array);
輸出
array (size=4)'foo' => string 'bar' (length=3)'bar' => string 'foo' (length=3)1 => int -1-1 => int 1
key 為可選項。如果未指定,PHP 將自動使用之前用過的最大 int 鍵名加上 1 作為新的鍵名。
接下來看一個不使用鍵名的示例,此時創建的數組就是一個索引數組。
$array = array("a", "b", "c", "d");
var_dump($array);
輸出
array (size=4)0 => string 'a' (length=1)1 => string 'b' (length=1)2 => string 'c' (length=1)3 => string 'd' (length=1)
還可以對某些單元指定鍵名,而其它位置為空,沒有鍵名。
$array = array("a","b",6 => "c","d",
);
var_dump($array);
輸出
array (size=4)0 => string 'a' (length=1)1 => string 'b' (length=1)6 => string 'c' (length=1)7 => string 'd' (length=1)
可以看到最后一個值 "d" 被自動賦予了鍵名 7。這是由于之前最大的整數鍵名是 6。
二、訪問數組
數組單元可以通過 array[key](數組名[鍵名]) 來訪問。
$arr = array("Hello, World","foo" => "bar","a",
);
var_dump($arr[0]);
var_dump($arr["foo"]);
var_dump($arr[1]);
?輸出
string 'Hello, World' (length=12)
string 'bar' (length=3)
string 'a' (length=1)
試圖訪問一個未定義的數組鍵名與訪問任何未定義變量一樣:會導致 E_WARNING 級別錯誤信息(在 PHP 8.0.0 之前是 E_NOTICE 級別),其結果為 null。
?如果要獲取數組中元素的個數,可以使用 count() 函數。count()?函數用于計算數組中元素的數量。
$arr1 = ["a", "b", "c"];
$arr2 = ["a" => 1, "b" => 1];echo count($arr1); // 輸出 "3"
echo "<br>";
echo count($arr2); // 輸出 "2"
1、數組解包
可以使用 [](自 PHP 7.1.0 起)語言結構解包數組。這些結構可用于將數組解包為不同的變量。
$source_array = ['a', 'b', 'c'];
[$a, $b, $c] = $source_array;echo $a . "<br>"; // 輸出 "a"
echo $b . "<br>"; // 輸出 "b"
echo $c . "<br>"; // 輸出 "c"
如果變量未提供,數組元素將會被忽略。數組解包始終從索引 0 開始。
$source_array = ['a', 'b', 'c'];
// 將索引 2 的元素分配給變量 $c
[, , $c] = $source_array;echo $c; // 輸出 "c"
自 PHP 7.1.0 起,也可以解包關聯數組。這在數字索引數組中更容易選擇正確的元素,因為可以顯式指定索引。
$source_array = ['a' => 1, 'b' => 2, 'c' => 3];
// 將索引 'c' 處的元素分配給變量 $three
['c' => $three] = $source_array;
echo $three; // 輸出 "3"echo "<br>";$source_array = ['a', 'b', 'c'];
// 將索引 2 處的元素分配給變量 $c
[2 => $c] = $source_array;
echo $c; // 輸出 "c"
數組解包也可用于兩個變量交換。
$a = 1;
$b = 2;[$b, $a] = [$a, $b];echo $a; // 輸出 "2"
echo "<br>";
echo $b; // 輸出 "1"
2、遍歷數組
使用 foreach 對數組進行遍歷。
語法
foreach (iterable_expression as $value) {// 代碼段
}foreach (iterable_expression as $key => $value) {// 代碼段
}
第一種格式遍歷給定的 iterable_expression 迭代器。每次循環中,當前單元的值被賦給 $value。該遍歷方式用于索引數組。
第二種格式做同樣的事,只除了當前單元的鍵名也會在每次循環中被賦給變量 $key。該遍歷方式用于關聯數組。
示例 foreach 遍歷索引數組
$arr = ["a", "b", "c", "d"];
foreach($arr as $value) {echo $value . "<br>";
}
/* 輸出abcd
*/
示例 foreach 遍歷關聯數組
$arr = ['a' => 1, 'b' => 2, 'c' => 3];
foreach($arr as $key => $value) {echo $key . ":" . $value . "<br>";
}
/* 輸出a:1b:2c:3
*/
三、操作數組
1、添加數組項
使用括號 [] 語法向現有數組中添加項(用于索引數組)。
$arr = ["a", "b", "c"];
$arr[] = ["d"];
var_dump($arr);
還可以使用 數組名[鍵名]=值 的方式向數組中添加項,如果鍵名在數組中已經存在,則會更改該鍵名對應的值。
$arr = ["a" => 1, "b" => 2, "c" => 3];
$arr["d"] = 4;
var_dump($arr);
使用?array_push()?函數可以向現有數組中添加多個項(用于索引數組)。
$arr = ["a", "b", "c"];
array_push($arr, "d", "e", "f");
var_dump($arr);
要向關聯數組中添加多個項,可以使用 += 運算符。
$arr = ["a" => 1, "b" => 2, "c" => 3];
$arr += ["d" => 4, "e" => 5];
var_dump($arr);
2、修改數組項
要修改現有的數組項,對于索引數組,可以引用索引號;對于關聯數組,可以引用鍵名。
示例 更改索引數組指定項的值
// 將數組第二項,即索引為 1 的項的值改為 "B"
$arr = ["a", "b", "c"];
$arr[1] = "B";
var_dump($arr);
示例 更改關聯數組指定鍵名的值
// 將鍵名 "b" 的值更改為 "二"
$arr = ["a" => 1, "b" => 2, "c" => 3];
$arr["b"] = "二";
var_dump($arr);
2.1、在 foreach 循環中修改數組項
通過在 $value 之前加上 & 來修改數組的元素。此方法將以引用賦值而不是拷貝一個值。
$arr = [1, 2, 3, 4];
foreach ($arr as &$value) {$value = $value * 2;
}
// 現在 $arr 是 array[2, 4, 6, 8]
unset($value); // 最后取消掉引用
var_dump($arr);
注意:數組最后一個元素的 $value 引用在 foreach 循環之后仍會保留。建議使用 unset() 來將其銷毀。
3、刪除數組項?
使用?unset()?函數來刪除現有的數組項。該函數接受無限數量的參數,因此可用于刪除多個數組項。
$arr = ["a", "b", "c", "d", "e", "f"];
unset($arr[1]); // 刪除1項
unset($arr[3], $arr[4]); // 刪除多項
var_dump($arr);$phones = array("brand" => "Vivo", "price" => 1999, "color" => "red");
unset($phones["price"]); // 刪除關聯數組中指定鍵名項
var_dump($phones);
輸出
array (size=3)0 => string 'a' (length=1)2 => string 'c' (length=1)5 => string 'f' (length=1)
array (size=2)'brand' => string 'Vivo' (length=4)'color' => string 'red' (length=3)
注意:unset()?函數不會重新排列索引,這意味著在刪除后,數組將不再包含缺失的索引。
?使用 array_pop()?函數刪除數組的最后一項。
$arr = ["a", "b", "c", "d", "e", "f"];
array_pop($arr);
var_dump($arr);
使用?array_shift()?函數刪除數組的第一項。
$arr = ["a", "b", "c", "d", "e", "f"];
array_shift($arr);
var_dump($arr);
四、多維數組
多維數組是一個包含一個或多個數組的數組,PHP 支持深度為二、三、四、五或更多層的多維數組。
數組的維度表示選擇元素所需的索引數量。
- 對于二維數組,需要兩個索引來選擇元素
- 對于三維數組,需要三個索引來選擇元素
本篇文章只對二維數組進行說明。
1、二維數組?
二維數組是數組的數組,我們通常使用它來保存表格數據。
首先,來看下面的表格:
手機品牌 | 庫存 | 價格 |
華為 | 200 | 1999 |
小米 | 350 | 1599 |
Vivo | 103 | 1799 |
我們可以將上表中的數據存儲在二維數組中,如下所示:
$phones = [["華為", 200, 1999],["小米", 350, 1599],["Vivo", 103, 1799]
];
現在二維的 $phones 數組包含四個數組,并且它有兩個索引:行和列(索引都是從 0 開始)。
要訪問 $phones 數組的元素,我們必須指向兩個索引(行和列):
echo $phones[0][0] . ":庫存:" . $phones[0][1] . ",價格:" . $phones[0][2] . "<br>";
echo $phones[1][0] . ":庫存:" . $phones[1][1] . ",價格:" . $phones[1][2] . "<br>";
echo $phones[2][0] . ":庫存:" . $phones[2][1] . ",價格:" . $phones[2][2] . "<br>";
還可將數組解包用于 foreach 在迭代多維數組時對其進行解包。
foreach ($phones as [$brand, $inventory, $price]) {echo $brand . ":庫存:" . $inventory . ",價格:" . $price . "<br>";
}
五、數組函數
PHP 提供了一組內置函數,可用于操作數組。該函數內容過多,就不在文章中一一進行記錄了,這里記錄下數組函數的文檔地址,方便以后使用時查閱。文檔地址:數組函數官方文檔。