PHP 中的數組實際上是一個有序映射。映射是一種把 values關聯到 keys 的類型。此類型在很多方面做了優化,因此可以把它當成真正的數組,或列表(向量),散列表(是映射的一種實現),字典,集合,棧,隊列以及更多可能性。由於數組元素的值也可以是另一個數組,樹形結構和多維數組也是允許的。
在PHP中,數組的每個元素都是由“鍵=>值”組成的,通過元素的鍵來訪問對應的鍵的值。“關聯數組”指的是鍵名為字符串的數組,“索引”和“鍵名“指的是同一樣東西。”索引“多指數組的數字形式的下標。使用數組的處理函數,可以很方便的對數組中的每個元素的鍵和值進行操作。
1定義數組array()
可以用array()結構來新建一個數組,接受任意數量用逗號分隔的 鍵(key)=>值(value)對,其中鍵(key)可以是一個整數integer或者字符string,值(value)可以使任意類型的值。自PHP5.4起可以使用短數組定義語法,用[]替代array()。
<?php
$array=array(
"foo"=>"bar",
"bar"=>"foo"
);
$array=[ //自從PHP5.4以后。
"foo"=>"bar",
"bar"=>"foo",
];
?>
key還會有如下的強制轉換:
- 包含有合法整型值的字符串會被轉換為整型。例如鍵名 "8" 實際會被儲存為 8。但是 "08"則不會強制轉換,因為其不是一個合法的十進制數值。
- 浮點數也會被轉換為整型,意味着其小數部分會被舍去。例如鍵名 8.7 實際會被儲存為 8。
- 布爾值也會被轉換成整型。即鍵名 true 實際會被儲存為 1而鍵名 false 會被儲存為 0。
- Null 會被轉換為空字符串,即鍵名 null 實際會被儲存為 ""。
- 數組和對象不能被用為鍵名。堅持這么做會導致警告:Illegal offset type。
- 如果在數組定義中多個單元都使用了同一個鍵名,則只使用了最后一個,之前的都被覆蓋了。
<?php
$array = array(
1 => "a",
"1" => "b",
1.5 => "c",
true => "d",
);
var_dump($array);
?>
以上例子會輸出:
array(1) {
[1]=>
string(1) "d"
}
還可以只對某些單元指定鍵名而對其它的空置:
<?php
$array = array(
"a",
"b",
6 => "c",
"d",
);
var_dump($array);
?>
以上例子輸出
array(4) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[6]=>
string(1) "c"
[7]=>
string(1) "d"
}
自PHP 5.4 起可以用數組間接引用函數或方法調用的結果。之前只能通過一個臨時變量,自 PHP 5.5 起可以用數組間接引用一個數組原型。
<?php
function getArray() {
return array(1, 2, 3);
}
// on PHP 5.4
$secondElement = getArray()[1];
// previously
$tmp = getArray();
$secondElement = $tmp[1];
// or
list(, $secondElement) = getArray();
?>
要修改某個值,通過其鍵名給該單元賦一個新值。要刪除某鍵值對,對其調用 unset() 函數。
<?php
$arr = array(5 => 1, 12 => 2);
$arr[] = 56; //相當於增加了一個$arr[13] = 56;
$arr["x"] = 42; //增加一個新元素,鍵key=’x‘
unset($arr[5]); //刪除數組中5=>1
unset($arr); // 刪除整個數組
?>
如果給出方括號但沒有指定鍵名,則取當前最大整數索引值,新的鍵名將是該值加上 1(但是最小為 0)。如果當前還沒有整數索引,則鍵名將為 0。注意這里所使用的最大整數鍵名不一定當前就在數組中。它只要在上次數組重新生成索引后曾經存在過就行了。以下面的例子來說明:
<?php
// 創建一個簡單的數組
$array = array(1, 2, 3, 4, 5);
print_r($array);
// 現在刪除其中的所有元素,但保持數組本身不變:
foreach ($array as $i => $value) {
unset($array[$i]);
}
print_r($array);
// 添加一個單元(注意新的鍵名是 5,而不是你可能以為的 0)
$array[] = 6;
print_r($array);
// 重新索引:
$array = array_values($array);
$array[] = 7;
print_r($array);
?>
以上例子會有如下輸出:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
Array
(
)
Array
(
[5] => 6
)
Array
(
[0] => 6
[1] => 7
)
2.is_array()
is_array — 檢測變量是否是數組,bool is_array ( mixed $var
),如果 var
是 array,則返回 TRUE
,否則返回 FALSE.
3.explode()
explode——使用一個字符串分割另一個字符串。array explode ( string $delimiter
, string $string
[, int $limit
] ),此函數返回由字符串組成的數組,每個元素都是 string
的一個子串,它們被字符串 delimiter
作為邊界點分割出來。delimiter 邊界上的分割字符,string輸入的字符串,如果設置了 limit
參數並且是正數,則返回的數組包含最多 limit
個元素,而最后那個元素將包含 string
的剩余部分。如果 limit
參數是負數,則返回除了最后的 -limit
個元素外的所有元素。如果 limit
是 0,則會被當做 1。
<?php
$str = 'one|two|three|four';
// 正數的 limit
print_r(explode('|', $str, 2));
// 負數的 limit(自 PHP 5.1 起)
print_r(explode('|', $str, -1));
?>
以上例子會有如下輸出
Array
(
[0] => one
[1] => two|three|four
)
Array
(
[0] => one
[1] => two
[2] => three
)
4.implode()
implode — 將一個一維數組的值轉化為字符串
<?php
$array = array('lastname', 'email', 'phone');
$comma_separated = implode(",", $array);
echo $comma_separated; // lastname,email,phone
// 當數組為空時,返回的字符串也是空
var_dump(implode('hello', array())); // string(0) ""
?>
5.split
split — 用正則表達式將字符串分割到數組中,array split ( string $pattern
, string $string
[, int $limit
] ),本函數返回一個字符串數組,每個單元為 string
經區分大小寫的正則表達式 pattern
作為邊界分割出的子串。如果設定了 limit
,則返回的數組最多包含 limit
個單元,而其中最后一個單元包含了 string
中剩余的所有部分。如果出錯,則 split() 返回 FALSE
。
<?php
// 分隔符可以是斜線,點,或橫線
$date = "04/30/1973";
list($month, $day, $year) = split ('[/.-]', $date);
echo "Month: $month; Day: $day; Year: $year<br />\n";
?>
6.preg_split()
preg_split — 通過一個正則表達式分隔字符串,array preg_split ( string $pattern
, string $subject
[, int $limit
= -1 [, int $flags
= 0 ]] ),pattern
用於搜索的模式,字符串形式。subject
輸入字符串
limit
如果指定,將限制分隔得到的子串最多只有limit
個,返回的最后一個 子串將包含所有剩余部分。limit
值為-1, 0或null時都代表"不限制", 作為php的標准,你可以使用null跳過對flags
的設置。