
5??
Array (數(shù)組):PHP中的數(shù)組實(shí)際上是一個(gè)有序映射。映射是一種把 values , 關(guān)聯(lián)到 keys 的類(lèi)型。 此類(lèi)型在很多方面做了優(yōu)化,因此可以把它當(dāng)成真正的數(shù)組,或列表(向量),散列表(映射的一種實(shí)現(xiàn)), 字典, 集合, 棧, 隊(duì)列以及更多可能性。由于數(shù)組的元素的值可以是另一個(gè)數(shù)組,樹(shù)形結(jié)構(gòu)和多維數(shù)組也是允許的
-
(一) 定義數(shù)組:
可以使用
array()語(yǔ)言結(jié)構(gòu)來(lái)新建一個(gè)數(shù)組,它接受任意數(shù)量用逗號(hào)分隔的鍵(key) =>值(value) 對(duì)。
example1.php
//數(shù)組的聲明:
$array1 = array('key' => 'value');
$array2 = ['name' => 'monkey']; //PHP5.4 以后可以使用 [],來(lái)聲明數(shù)組;
注意:
- 鍵(key) 可以是一個(gè)整數(shù)(
integer) 類(lèi)型,也可以是字符串 (string) 類(lèi)型;- 值(
value) 可以是任意類(lèi)型的值;- 鍵(
key)會(huì)有以下的強(qiáng)制轉(zhuǎn)換:
- 包含合法整型值得字符串會(huì)被轉(zhuǎn)換為整型。例如:鍵名
"8"實(shí)際會(huì)被存儲(chǔ)為8。但是"08"則不會(huì)強(qiáng)制準(zhǔn)換,因?yàn)槠洳皇且粋€(gè)合法的十進(jìn)制數(shù)值;- 浮點(diǎn)數(shù)也會(huì)被轉(zhuǎn)換成為整型,意味著其小數(shù)部分會(huì)被舍去。例如:鍵名
"8.7"實(shí)際會(huì)被儲(chǔ)存為8;- 布爾值也會(huì)被轉(zhuǎn)換成整型。即鍵名
true實(shí)際會(huì)被存儲(chǔ)為1,false會(huì)被存儲(chǔ)為0;null會(huì)被轉(zhuǎn)換成空字符串 。 即鍵名會(huì)被轉(zhuǎn)換成'';- 數(shù)組和對(duì)象不能用作鍵名。會(huì)導(dǎo)致警告錯(cuò)誤
Illegal offset type;
如果在數(shù)組定義中多個(gè)單元都使用了同一個(gè)鍵名,則只使用了最后一個(gè),之前的都被覆蓋了;
example2.php
//類(lèi)型強(qiáng)制轉(zhuǎn)換與覆蓋
<?php
$array = array(
1 => "a",
"1" => "b",
1.5 => "c",
true => "d",
);
var_dump($array);
/**
運(yùn)行結(jié)果是:
array(1) {
[1]=>
string(1) "d"
}
**
?>
php數(shù)組可以同時(shí)含有
integer和string類(lèi)型的鍵名,因?yàn)镻HP實(shí)際并不區(qū)分索引數(shù)組和關(guān)聯(lián)數(shù)組。
如果對(duì)給出的值沒(méi)有指定鍵名,則取出當(dāng)前最大的整數(shù)索引值,而新的鍵名將是該值加一。如果指定的鍵名已經(jīng)有了值,則該值會(huì)被覆蓋;
example3.php
//混合 integer 和 string 的鍵名
$array = array(
"foo" => "bar",
"bar" => "foo",
100 => -100,
-100 => 100,
);
var_dump($array);
/**
以上會(huì)輸出:
array(4) {
["foo"]=>
string(3) "bar"
["bar"]=>
string(3) "foo"
[100]=>
int(-100)
[-100]=>
int(100)
}
key是可選項(xiàng),如果未指定。PHP將自動(dòng)使用之前用過(guò)的最大integer鍵+1作為新的鍵名;
example4.php
//沒(méi)有鍵名的索引數(shù)組
<?php
$array = array("foo", "bar", "hallo", "world");
var_dump($array);
?>
/** 以上會(huì)輸出
array(4) {
[0]=>
string(3) "foo"
[1]=>
string(3) "bar"
[2]=>
string(5) "hallo"
[3]=>
string(5) "world"
}
**/
可以只對(duì)某些單元指定鍵名,其他的不指定鍵名;
example5.php
<?php
$array = array(
"a",
"b",
6 => "c",
"d",
);
var_dump($array);
/**
以上會(huì)輸出:
array(4) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[6]=>
string(1) "c"
[7]=>
string(1) "d"
}
**/
最后一個(gè)值
d被自動(dòng)賦予鍵名7, 是因?yàn)橹白畲蟮恼麛?shù)鍵名是6;
-
訪(fǎng)問(wèn)數(shù)組單元:
可以使用
[]的語(yǔ)法來(lái)訪(fǎng)問(wèn)數(shù)組中的單元;
example6.php
<?php
$array = array(
"foo" => "bar",
42 => 24,
"multi" => array(
"dimensional" => array(
"array" => "foo"
)
)
);
var_dump($array["foo"]);
var_dump($array[42]);
var_dump($array["multi"]["dimensional"]["array"]);
/**
以上會(huì)輸出:
string(3) "bar"
int(24)
string(3) "foo"
**/
注意:方括號(hào)
[]和花括號(hào){}可以互換使用來(lái)訪(fǎng)問(wèn)數(shù)組單元, (例如:$array[43]和$array{43}在上實(shí)例中效果相同);
- 使用方括號(hào)的語(yǔ)法 新建 / 修改 數(shù)組:
可以通過(guò)明示的設(shè)定其中的值來(lái)修改一個(gè)已有的數(shù)組;
這是通過(guò)在方括號(hào)內(nèi)指定鍵名來(lái)給數(shù)組賦值實(shí)現(xiàn)的。也可以省略鍵名,在這種情況下給變量名加上一對(duì)空的方括號(hào)[];
$arr[key] = value;
$arr[] = value;
// key 可以是 integer 或 string
// value 可以是任意類(lèi)型的值
如果
$arr還不存在,則會(huì)新建一個(gè)。
要修改某個(gè)值,通過(guò)其鍵名給該單元賦一個(gè)新值。要?jiǎng)h除某鍵值對(duì),對(duì)其調(diào)用unset()函數(shù);
此處暫不細(xì)說(shuō)數(shù)組操作函數(shù),后期詳細(xì)說(shuō)明;
example7.php
<?php
$arr = array(5 => 1, 12 => 2);
$arr[] = 56; // 增加一個(gè)鍵名是 13 的單元 $arr[13] = 56;
$arr["x"] = 42; // 增加一個(gè) 鍵名是 "x" 的單元
unset($arr[5]); // 刪除掉 $arr 數(shù)組中 鍵名是 5 的單元
unset($arr); // 刪除整個(gè)數(shù)組 $arr
?>
如果給出方括號(hào)但沒(méi)有指定鍵名,則取當(dāng)前最大整數(shù)索引值,新的鍵名將是該值
+ 1(但是最小為 0)。如果當(dāng)前還沒(méi)有整數(shù)索引,則鍵名將為0。
注意:這里所使用的最大整數(shù)鍵名
不一定就在當(dāng)前數(shù)組中。它只要在上次數(shù)組重新生成索引后,曾經(jīng)存在過(guò)就行了;(有點(diǎn)繞,看示例);
example8.php
<?php
// 創(chuàng)建一個(gè)簡(jiǎn)單的數(shù)組
$array = array(1, 2, 3, 4, 5);
print_r($array);
// 現(xiàn)在刪除其中的所有元素,但保持?jǐn)?shù)組本身不變:
foreach ($array as $i => $value) {
unset($array[$i]);
}
print_r($array);
// 添加一個(gè)單元(注意新的鍵名是 5,而不是你可能以為的 0)
$array[] = 6;
print_r($array);
// 重新索引:
$array = array_values($array);
$array[] = 7;
print_r($array);
執(zhí)行結(jié)果:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
Array
(
)
Array
(
[5] => 6
)
Array
(
[0] => 6
[1] => 7
)
理論聽(tīng)著可能比較繞,但容易理解;
注意:強(qiáng)烈不建議
$arrp[bar]這樣寫(xiě),而是要寫(xiě)成$arr['bar'];注意數(shù)組中單元中使用""或者'';
- 這樣是錯(cuò)的,但可以正常運(yùn)行。那么為什么錯(cuò)了呢?原因是此代碼中有一個(gè)未定義的常量(bar)而不是字符串('bar'-注意引號(hào)),而 PHP 可能會(huì)在以后定義此常量,不幸的是你的代碼中有同樣的名字。它能運(yùn)行,是因?yàn)?PHP 自動(dòng)將裸字符串(沒(méi)有引號(hào)的字符串且不對(duì)應(yīng)于任何已知符號(hào))轉(zhuǎn)換成一個(gè)其值為該裸字符串的正常字符串。例如,如果沒(méi)有常量定義為 bar,PHP 將把它替代為 'bar' 并使用之。
- 也許有一天,PHP 開(kāi)發(fā)小組可能會(huì)想新增一個(gè)常量或者關(guān)鍵字,或者用戶(hù)可能希望以后在自己的程序中引入新的常量,那就有麻煩了。例如已經(jīng)不能這樣用 empty 和 default 這兩個(gè)詞了,因?yàn)樗麄兪?code>保留字
- 轉(zhuǎn)換為數(shù)組:
- 對(duì)于任何類(lèi)型
integer,float,boolean,resource類(lèi)型,如果建一個(gè)值轉(zhuǎn)換成數(shù)組,將得到一個(gè)僅有一個(gè)元素的數(shù)組,其鍵名是0,該元素即為此標(biāo)量的值。(array)$scalarValue與array($scalarValue)完全一樣。- 如果一個(gè)
object類(lèi)型轉(zhuǎn)換成一個(gè)array類(lèi)型,則結(jié)果為一個(gè)數(shù)組,其單元為該對(duì)象的屬性。鍵名將為成員變量名,不過(guò)有幾點(diǎn)例外:
- 整數(shù)屬性不可訪(fǎng)問(wèn);
- 私有變量前會(huì)加上類(lèi)名作前綴;
- 保護(hù)變量前會(huì)加上一個(gè)
""作前綴。這些前綴的前后都各有一個(gè)null字符,這回導(dǎo)致一些不可預(yù)知的行為:
example9.php
<?php
class A {
private $A; // This will become '\0A\0A'
}
class B extends A {
private $A; // This will become '\0B\0A'
public $AA; // This will become 'AA'
}
var_dump((array) new B());
?>
/**
執(zhí)行結(jié)果
array(3) {
["BA"]=>
NULL
["AA"]=>
NULL
["AA"]=>
NULL
}
**/
- 將 NULL 轉(zhuǎn)換為
array會(huì)得到一個(gè)空的數(shù)組。
6??object 對(duì)象:
要?jiǎng)?chuàng)建一個(gè)對(duì)象
object,需要使用new語(yǔ)句來(lái)實(shí)例化;(后期詳細(xì)說(shuō)類(lèi)和對(duì)象);
轉(zhuǎn)換成對(duì)象:
- 將一個(gè)對(duì)象轉(zhuǎn)換成對(duì)象,它將不會(huì)有任何的變化;
- 如果其他任何類(lèi)型的值轉(zhuǎn)換成對(duì)象,將會(huì)創(chuàng)建一個(gè)內(nèi)置類(lèi)
stdClass的實(shí)例。- 如果
null轉(zhuǎn)換成對(duì)象,則新實(shí)例為空;array轉(zhuǎn)換成object將使用鍵名稱(chēng)為屬性名并具有相對(duì)應(yīng)的值,除了數(shù)字鍵,不迭代就無(wú)法被訪(fǎng)問(wèn);
$obj = (object) array('1' => 'foo');
var_dump(isset($obj->{'1'})); // bool(false)
var_dump(key($obj)); // int(1)
對(duì)于其他值,會(huì)包含進(jìn)成員變量名:
<?php
$obj = (object) 'ciao';
var_dump($obj);
/**
object(stdClass)#1 (1) {
["scalar"]=>
string(4) "ciao"
}
**/
echo $obj->scalar; // 輸出 'ciao'
7?? NULL :
特殊的
NULL值表示一個(gè)變量都沒(méi)有。NULL類(lèi)型唯一可能的值就是null;
以下情況變量會(huì)被認(rèn)為是 NULL:
- 被賦值為
NULL;- 為聲明的變量;
- 被
unset()的變量;
- 語(yǔ)法:
NULL類(lèi)型只有一個(gè)值,就是不區(qū)分大小寫(xiě)的常量NULL;
- 轉(zhuǎn)換到
NULL:
使用
unset函數(shù)將一個(gè)變量轉(zhuǎn)換成NULL, 將不會(huì)刪除該變量或unset其值。僅是返回NULL而已;
8?? resource 資源:
資源是以一個(gè)特殊的變量,保存了到外部資源的一個(gè)引用。資源是通過(guò)專(zhuān)門(mén)的函數(shù)來(lái)建立和使用的。
以后說(shuō)資源的相關(guān)函數(shù)及其相應(yīng)資源類(lèi)型;
轉(zhuǎn)換為資源:
由于資源類(lèi)型變量保存有為打開(kāi)文件、數(shù)據(jù)庫(kù)連接、圖形畫(huà)布區(qū)域等的特殊句柄,因此將其它類(lèi)型的值轉(zhuǎn)換為資源沒(méi)有意義。
以上就是 PHP數(shù)組類(lèi)型 的全部?jī)?nèi)容,歡迎糾錯(cuò)和補(bǔ)充,感謝?。?!
相關(guān)題目:
<?php
//寫(xiě)出PHP的超全局變量(數(shù)組),并解釋每個(gè)的含義;
?>