簡(jiǎn)介
PHP 支持 8 種原始數(shù)據(jù)類型。
四種標(biāo)量類型:
boolean(布爾型)/ integer(整型) / float(浮點(diǎn)型,也稱作 double) / string(字符串)
兩種復(fù)合類型:
array(數(shù)組) / object(對(duì)象)
最后是兩種特殊類型:
resource(資源) / NULL(無(wú)類型)
Boolean 布爾類型
- 指定一個(gè)布爾值,使用關(guān)鍵字 TRUE 或 FALSE。兩個(gè)都不區(qū)分大小寫(xiě)。
- 將一個(gè)值轉(zhuǎn)換成 boolean,用 (bool) 或者 (boolean) 來(lái)強(qiáng)制轉(zhuǎn)換。
- 運(yùn)算符,函數(shù)或者流程控制結(jié)構(gòu)需要一個(gè) boolean 參數(shù)時(shí),該值會(huì)被自動(dòng)轉(zhuǎn)換
類型轉(zhuǎn)換:
當(dāng)轉(zhuǎn)換為 boolean 時(shí),以下值被認(rèn)為是 FALSE(所有其它值都被認(rèn)為是 TRUE,包括0和負(fù)數(shù))
- 布爾值 FALSE 本身
- 整型值 0(零)
- 浮點(diǎn)型值 0.0(零)
- 空字符串,以及字符串 "0"
- 不包括任何元素的數(shù)組
- 不包括任何成員變量的對(duì)象(僅 PHP 4.0 適用)
- 特殊類型 NULL(包括尚未賦值的變量)
- 從空標(biāo)記生成的 SimpleXML 對(duì)象
Integer 整型
- 一個(gè) integer 是集合 ? = {..., -2, -1, 0, 1, 2, ...} 中的一個(gè)數(shù)。
- 整型值可以使用十進(jìn)制,十六進(jìn)制,八進(jìn)制或二進(jìn)制表示,前面可以加上可選的符號(hào)(- 或者 +)。
- 二進(jìn)制表達(dá)的 integer 自 PHP 5.4.0 起可用。
- 要使用八進(jìn)制表達(dá),數(shù)字前必須加上 0(零)。要使用十六進(jìn)制表達(dá),數(shù)字前必須加上 0x。要使用二進(jìn)制表達(dá),數(shù)字前必須加上 0b。
- PHP 不支持無(wú)符號(hào)整數(shù)。
- Integer 值的字長(zhǎng)可以用常量 PHP_INT_SIZE來(lái)表示,自 PHP 4.4.0 和 PHP 5.0.5后,最大值可以用常量 PHP_INT_MAX 來(lái)表示。
- 整數(shù)溢出,將會(huì)被解釋為 float。同樣如果執(zhí)行的運(yùn)算結(jié)果超出了 integer 范圍,也會(huì)返回 float。
- PHP 中沒(méi)有整除的運(yùn)算符。值可以舍棄小數(shù)部分強(qiáng)制轉(zhuǎn)換為 integer,或者使用 round() 函數(shù)可以更好地進(jìn)行四舍五入。
轉(zhuǎn)換為整型
- 要明確地將一個(gè)值轉(zhuǎn)換為 integer,用 (int) 或 (integer) 強(qiáng)制轉(zhuǎn)換。
- 大多數(shù)情況下都不需要強(qiáng)制轉(zhuǎn)換,當(dāng)運(yùn)算符,函數(shù)或流程控制需要一個(gè) integer 參數(shù)時(shí),值會(huì)自動(dòng)轉(zhuǎn)換。
- 通過(guò)函數(shù) intval() 來(lái)將一個(gè)值轉(zhuǎn)換成整型。
- (布爾值轉(zhuǎn)換)FALSE 將產(chǎn)生出 0(零),TRUE 將產(chǎn)生出 1(壹)。
- (浮點(diǎn)型轉(zhuǎn)換) 當(dāng)從浮點(diǎn)數(shù)轉(zhuǎn)換成整數(shù)時(shí),將向下取整。
- 如果浮點(diǎn)數(shù)超出了整數(shù)范圍,則結(jié)果為未定義,因?yàn)闆](méi)有足夠的精度給出一個(gè)確切的整數(shù)結(jié)果。
- 決不要將未知的分?jǐn)?shù)強(qiáng)制轉(zhuǎn)換為 integer,這樣有時(shí)會(huì)導(dǎo)致不可預(yù)料的結(jié)果。
Float 浮點(diǎn)型
浮點(diǎn)型(也叫浮點(diǎn)數(shù) float,雙精度數(shù) double 或?qū)崝?shù) real)
比較浮點(diǎn)數(shù)
要測(cè)試浮點(diǎn)數(shù)是否相等,要使用一個(gè)僅比該數(shù)值大一丁點(diǎn)的最小誤差值。該值也被稱為機(jī)器極小值(epsilon)或最小單元取整數(shù),是計(jì)算中所能接受的最小的差別值。
$a 和 $b 在小數(shù)點(diǎn)后五位精度內(nèi)都是相等的。
<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;
if(abs($a-$b) < $epsilon) {
echo "true";
}
?>
NaN
- 某代表著一個(gè)在浮點(diǎn)數(shù)運(yùn)算中未定義或不可表述的值。
- 任何拿此值與其它任何值進(jìn)行的松散或嚴(yán)格比較的結(jié)果都是 FALSE。
- 由于 NAN 代表著任何不同值,不應(yīng)拿 NAN 去和其它值進(jìn)行比較,包括其自身,應(yīng)該用 is_nan() 來(lái)檢查。
String 字符串
- 一個(gè)字符串 string 就是由一系列的字符組成,其中每個(gè)字符等同于一個(gè)字節(jié)。這意味著 PHP 只能支持 256 的字符集,因此不支持 Unicode 。
- string 最大可以達(dá)到 2GB。
- 一個(gè)字符串可以用 4 種方式表達(dá)
單引號(hào)
- 要表達(dá)一個(gè)單引號(hào)自身,需在它的前面加個(gè)反斜線(\)來(lái)轉(zhuǎn)義。
- 要表達(dá)一個(gè)反斜線自身,則用兩個(gè)反斜線(\)。
- 單引號(hào)字符串中的變量和特殊字符的轉(zhuǎn)義序列將不會(huì)被替換。
<?php
echo 'this is a simple string';
// 可以錄入多行
echo 'You can also have embedded newlines in
strings this way as it is
okay to do';
// 輸出: Arnold once said: "I'll be back"
echo 'Arnold once said: "I\'ll be back"';
// 輸出: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';
// 輸出: You deleted C:\*.*?
echo 'You deleted C:\*.*?';
// 輸出: This will not expand: \n a newline
echo 'This will not expand: \n a newline';
// 輸出: Variables do not $expand $either
echo 'Variables do not $expand $either';
?>
雙引號(hào)
用雙引號(hào)定義的字符串最重要的特征是變量會(huì)被解析
Heredoc 結(jié)構(gòu)
- heredoc 句法結(jié)構(gòu):<<<。在該運(yùn)算符之后要提供一個(gè)標(biāo)識(shí)符,然后換行。接下來(lái)是字符串 string 本身,最后要用前面定義的標(biāo)識(shí)符作為結(jié)束標(biāo)志。結(jié)束時(shí)所引用的標(biāo)識(shí)符必須在該行的第一列,而且,標(biāo)識(shí)符的命名也要像其它標(biāo)簽一樣遵守 PHP 的規(guī)則:只能包含字母、數(shù)字和下劃線,并且必須以字母和下劃線作為開(kāi)頭。
- 結(jié)束標(biāo)識(shí)符這行除了可能有一個(gè)分號(hào)(;)外,絕對(duì)不能包含其它字符。不能縮進(jìn),分號(hào)的前后也不能有任何空白或制表符。
- 結(jié)束標(biāo)識(shí)符的前面必須是個(gè)被本地操作系統(tǒng)認(rèn)可的換行,比如在 UNIX 和 Mac OS X 系統(tǒng)中是 \n,而結(jié)束定界符(可能其后有個(gè)分號(hào))之后也必須緊跟一個(gè)換行。
- 如果在文件結(jié)束前也沒(méi)有找到一個(gè)正確的結(jié)束標(biāo)識(shí)符,PHP 將會(huì)在最后一行產(chǎn)生一個(gè)解析錯(cuò)誤。
- Heredocs 結(jié)構(gòu)不能用來(lái)初始化類的屬性。自 PHP 5.3 起,此限制僅對(duì) heredoc 包含變量時(shí)有效。
Heredoc 結(jié)構(gòu)就象是沒(méi)有使用雙引號(hào)的雙引號(hào)字符串(heredoc 結(jié)構(gòu)中)單引號(hào)不用被轉(zhuǎn)義,轉(zhuǎn)移字符。變量將被替換)。
<?php
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;
/* 含有變量的更復(fù)雜示例 */
class foo
{
var $foo;
var $bar;
function foo()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'MyName';
echo <<<EOT
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should print a capital 'A': \x41
EOT;
?>
Heredoc 結(jié)構(gòu)用在函數(shù)參數(shù)中來(lái)傳遞數(shù)據(jù)
<?php
var_dump(array(<<<EOD
foobar!
EOD
));
?>
在 PHP 5.3.0 以后,也可以用 Heredoc 結(jié)構(gòu)來(lái)初始化靜態(tài)變量和類的屬性和常量
<?php
// 靜態(tài)變量
function foo()
{
static $bar = <<<LABEL
Nothing in here...
LABEL;
}
// 類的常量、屬性
class foo
{
const BAR = <<<FOOBAR
Constant example
FOOBAR;
public $baz = <<<FOOBAR
Property example
FOOBAR;
}
?>
自 PHP 5.3.0 起還可以在 Heredoc 結(jié)構(gòu)中用雙引號(hào)來(lái)聲明標(biāo)識(shí)符:
<?php
echo <<<"FOOBAR"
Hello World!
FOOBAR;
?>
Nowdoc 結(jié)構(gòu)
- Nowdoc 結(jié)構(gòu)是類似于單引號(hào)字符串的,不進(jìn)行解析操作。適合用于嵌入 PHP 代碼或其它大段文本而無(wú)需對(duì)其中的特殊字符進(jìn)行轉(zhuǎn)義。
- Nowdoc 結(jié)構(gòu)是在 PHP 5.3.0 中加入的
標(biāo)記 <<<, 但是跟在后面的標(biāo)識(shí)符要用單引號(hào)括起來(lái),即 <<<'EOT'。Heredoc 結(jié)構(gòu)的所有規(guī)則也同樣適用于 nowdoc 結(jié)構(gòu),尤其是結(jié)束標(biāo)識(shí)符的規(guī)則。
<?php
$str = <<<'EOD'
Example of string
spanning multiple lines
using nowdoc syntax.
EOD;
/* 含有變量的更復(fù)雜的示例 */
class foo
{
public $foo;
public $bar;
function foo()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'MyName';
echo <<<'EOT'
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': \x41
EOT;
?>
nowdoc 結(jié)構(gòu)可以用在任意的靜態(tài)數(shù)據(jù)環(huán)境中
<?php
class foo {
public $bar = <<<'EOT'
bar
EOT;
}
?>
變量解析
- 當(dāng)字符串用雙引號(hào)或 heredoc 結(jié)構(gòu)定義時(shí),其中的變量將會(huì)被解析。
- 兩種語(yǔ)法規(guī)則:一種簡(jiǎn)單規(guī)則,一種復(fù)雜規(guī)則。簡(jiǎn)單的語(yǔ)法規(guī)則是最常用和最方便的,它可以用最少的代碼在一個(gè) string 中嵌入一個(gè)變量,一個(gè) array 的值,或一個(gè) object 的屬性。
簡(jiǎn)單語(yǔ)法
當(dāng) PHP 解析器遇到一個(gè)美元符號(hào)($)時(shí),它會(huì)和其它很多解析器一樣,去組合盡量多的標(biāo)識(shí)以形成一個(gè)合法的變量名。可以用花括號(hào)來(lái)明確變量名的界線。
<?php
$juice = "apple";
echo "He drank some $juice juice.".PHP_EOL;
// Invalid. "s" is a valid character for a variable name, but the variable is $juice.
echo "He drank some juice made of $juices.";
?>
一個(gè) array 索引或一個(gè) object 屬性也可被解析。數(shù)組索引要用方括號(hào)(])來(lái)表示索引結(jié)束的邊際,對(duì)象屬性則是和上述的變量規(guī)則相同。
<?php
$juices = array("apple", "orange", "koolaid1" => "purple");
echo "He drank some $juices[0] juice.".PHP_EOL;
echo "He drank some $juices[1] juice.".PHP_EOL;
echo "He drank some juice made of $juice[0]s.".PHP_EOL; // Won't work
echo "He drank some $juices[koolaid1] juice.".PHP_EOL;
class people {
public $john = "John Smith";
public $jane = "Jane Smith";
public $robert = "Robert Paulsen";
public $smith = "Smith";
}
$people = new people();
echo "$people->john drank some $juices[0] juice.".PHP_EOL;
echo "$people->john then said hello to $people->jane.".PHP_EOL;
echo "$people->john's wife greeted $people->robert.".PHP_EOL;
echo "$people->robert greeted the two $people->smiths."; // Won't work
?>
復(fù)雜(花括號(hào))語(yǔ)法
任何具有 string 表達(dá)的標(biāo)量變量,數(shù)組單元或?qū)ο髮傩远伎墒褂么苏Z(yǔ)法。
用花括號(hào) { 和 } 把表達(dá)式括起來(lái)即可。由于 { 無(wú)法被轉(zhuǎn)義,只有 $ 緊挨著 { 時(shí)才會(huì)被識(shí)別。可以用 {$ 來(lái)表達(dá) {$。
<?php
// 顯示所有錯(cuò)誤
error_reporting(E_ALL);
$great = 'fantastic';
// 無(wú)效,輸出: This is { fantastic}
echo "This is { $great}";
// 有效,輸出: This is fantastic
echo "This is {$great}";
echo "This is ${great}";
// 有效
echo "This square is {$square->width}00 centimeters broad.";
// 有效,只有通過(guò)花括號(hào)語(yǔ)法才能正確解析帶引號(hào)的鍵名
echo "This works: {$arr['key']}";
// 有效
echo "This works: {$arr[4][3]}";
// 這是錯(cuò)誤的表達(dá)式,因?yàn)榫拖?$foo[bar] 的格式在字符串以外也是錯(cuò)的一樣。
// 換句話說(shuō),只有在 PHP 能找到常量 foo 的前提下才會(huì)正常工作;這里會(huì)產(chǎn)生一個(gè)
// E_NOTICE (undefined constant) 級(jí)別的錯(cuò)誤。
echo "This is wrong: {$arr[foo][3]}";
// 有效,當(dāng)在字符串中使用多重?cái)?shù)組時(shí),一定要用括號(hào)將它括起來(lái)
echo "This works: {$arr['foo'][3]}";
// 有效
echo "This works: " . $arr['foo'][3];
echo "This works too: {$obj->values[3]->name}";
echo "This is the value of the var named $name: {${$name}}";
echo "This is the value of the var named by the return value of getName(): {${getName()}}";
echo "This is the value of the var named by the return value of \$object->getName(): {${$object->getName()}}";
// 無(wú)效,輸出: This is the return value of getName(): {getName()}
echo "This is the return value of getName(): {getName()}";
?>
<?php
// 顯示所有錯(cuò)誤
error_reporting(E_ALL);
class beers {
const softdrink = 'rootbeer';
public static $ale = 'ipa';
}
$rootbeer = 'A & W';
$ipa = 'Alexander Keith\'s';
// 有效,輸出: I'd like an A & W
echo "I'd like an {${beers::softdrink}}\n";
// 也有效,輸出: I'd like an Alexander Keith's
echo "I'd like an {${beers::$ale}}\n";
?>
存取和修改字符串中的字符
- string 中的字符可以通過(guò)下標(biāo),用類似 array 結(jié)構(gòu)中的方括號(hào)包含對(duì)應(yīng)的數(shù)字來(lái)訪問(wèn)和修改,可以把 string 當(dāng)成字符組成的 array。
- 也可用花括號(hào)訪問(wèn),比如 $str{42}
用超出字符串長(zhǎng)度的下標(biāo)寫(xiě)入將會(huì)拉長(zhǎng)該字符串并以空格填充。非整數(shù)類型下標(biāo)會(huì)被轉(zhuǎn)換成整數(shù)。非法下標(biāo)類型會(huì)產(chǎn)生一個(gè) E_NOTICE 級(jí)別錯(cuò)誤。用負(fù)數(shù)下標(biāo)寫(xiě)入字符串時(shí)會(huì)產(chǎn)生一個(gè) E_NOTICE 級(jí)別錯(cuò)誤,用負(fù)數(shù)下標(biāo)讀取字符串時(shí)返回空字符串。寫(xiě)入時(shí)只用到了賦值字符串的第一個(gè)字符。用空字符串賦值則賦給的值是 NULL 字符。
PHP 的字符串在內(nèi)部是字節(jié)組成的數(shù)組。因此用花括號(hào)訪問(wèn)或修改字符串對(duì)多字節(jié)字符集很不安全。
<?php
// 取得字符串的第一個(gè)字符
$str = 'This is a test.';
$first = $str[0];
// 取得字符串的第三個(gè)字符
$third = $str[2];
// 取得字符串的最后一個(gè)字符
$str = 'This is still a test.';
$last = $str[strlen($str)-1];
// 修改字符串的最后一個(gè)字符
$str = 'Look at the sea';
$str[strlen($str)-1] = 'e';
?>
PHP 5.4 起字符串下標(biāo)必須為整數(shù)或可轉(zhuǎn)換為整數(shù)的字符串,否則會(huì)發(fā)出警告。
用 [] 或 {} 訪問(wèn)任何其它類型(不包括數(shù)組或具有相應(yīng)接口的對(duì)象實(shí)現(xiàn))的變量只會(huì)無(wú)聲地返回 NULL。
有用的函數(shù)和運(yùn)算符
字符串可以用 '.'(點(diǎn))運(yùn)算符連接起來(lái)
轉(zhuǎn)換成字符串
- 值前面加上 (string) 或用 strval() 函數(shù)來(lái)轉(zhuǎn)變成字符串
- 在需要字符串的表達(dá)式中,會(huì)自動(dòng)轉(zhuǎn)換為 string(在使用函數(shù) echo 或 print 時(shí)和在一個(gè)變量或者一個(gè)變量和一個(gè) string 進(jìn)行比較時(shí))
- 也可使用函數(shù) settype()
- 一個(gè)布爾值 boolean 的 TRUE 被轉(zhuǎn)換成 string 的 "1"。
- Boolean 的 FALSE 被轉(zhuǎn)換成 ""(空字符串)。
- 一個(gè)整數(shù) integer 或浮點(diǎn)數(shù) float 被轉(zhuǎn)換為數(shù)字的字面樣式的 string(包括 float 中的指數(shù)部分)。使用指數(shù)計(jì)數(shù)法的浮點(diǎn)數(shù)(4.1E+6)也可轉(zhuǎn)換。
- 數(shù)組 array 總是轉(zhuǎn)換成字符串 "Array",因此,echo 和 print 無(wú)法顯示出該數(shù)組的內(nèi)容。
- PHP 4 中對(duì)象 object 總是被轉(zhuǎn)換成字符串 "Object"。為了得到對(duì)象的類的名稱,可以用 get_class() 函數(shù)。自 PHP 5 起,適當(dāng)時(shí)可以用 __toString 方法。
- 資源 resource 總會(huì)被轉(zhuǎn)變成 "Resource id #1" 這種結(jié)構(gòu)的字符串,其中的 1 是 PHP 在運(yùn)行時(shí)分配給該 resource 的唯一值。要得到一個(gè) resource 的類型,可以用函數(shù) get_resource_type()。
- NULL 總是被轉(zhuǎn)變成空字符串。
- 大部分的 PHP 值可以轉(zhuǎn)變成 string 來(lái)永久保存,這被稱作串行化,可以用函數(shù) serialize() 來(lái)實(shí)現(xiàn)。如果 PHP 引擎設(shè)定支持 WDDX,PHP 值也可被串行化為格式良好的 XML 文本。
字符串轉(zhuǎn)換為數(shù)值
- 如果該字符串沒(méi)有包含 '.','e' 或 'E' 并且其數(shù)字值在整型的范圍之內(nèi)(由 PHP_INT_MAX 所定義),該字符串將被當(dāng)成 integer 來(lái)取值。
- 該字符串的開(kāi)始部分決定了它的值。如果該字符串以合法的數(shù)值開(kāi)始,則使用該數(shù)值。否則其值為 0(零)。
- 合法數(shù)值由可選的正負(fù)號(hào),后面跟著一個(gè)或多個(gè)數(shù)字(可能有小數(shù)點(diǎn)),再跟著可選的指數(shù)部分。指數(shù)部分由 'e' 或 'E' 后面跟著一個(gè)或多個(gè)數(shù)字構(gòu)成。
<?php
$foo = 1 + "10.5"; // $foo is float (11.5)
$foo = 1 + "-1.3e3"; // $foo is float (-1299)
$foo = 1 + "bob-1.3e3"; // $foo is integer (1)
$foo = 1 + "bob3"; // $foo is integer (1)
$foo = 1 + "10 Small Pigs"; // $foo is integer (11)
$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)
$foo = "10.0 pigs " + 1; // $foo is float (11)
$foo = "10.0 pigs " + 1.0; // $foo is float (11)
?>
- 通過(guò)將一個(gè)字符轉(zhuǎn)換成整數(shù)以得到其代碼。使用函數(shù) ord() 和 chr() 實(shí)現(xiàn) ASCII 碼和字符間的轉(zhuǎn)換。
字符串類型詳解
- string 是一個(gè)由字節(jié)組成的數(shù)組再加上一個(gè)整數(shù)指明緩沖區(qū)長(zhǎng)度。
- 字符串類型的此特性解釋了為什么 PHP 中沒(méi)有單獨(dú)的“byte”類型 - 已經(jīng)用字符串來(lái)代替了。返回非文本值的函數(shù) - 例如從網(wǎng)絡(luò)套接字讀取的任意數(shù)據(jù) - 仍會(huì)返回字符串。
字符串會(huì)被按照該腳本文件相同的編碼方式來(lái)編碼。不過(guò)這并不適用于激活了 Zend Multibyte 時(shí)(如果激活了 Zend Multibyte 則是其內(nèi)部編碼)- 這意味著此編碼應(yīng)該是 ASCII 的兼容超集,
- 某些函數(shù)假定字符串是以單字節(jié)編碼的。例如 substr(),strpos(),strlen() 和 strcmp()。理解這些函數(shù)的另一種方法是它們作用于內(nèi)存緩沖區(qū),即按照字節(jié)和字節(jié)下標(biāo)操作。
- 某些函數(shù)被傳遞入了字符串的編碼方式,也可能會(huì)假定默認(rèn)無(wú)此信息。例如 htmlentities() 和 mbstring 擴(kuò)展中的大部分函數(shù)。
- 其它函數(shù)使用了當(dāng)前區(qū)域(見(jiàn) setlocale()),但是逐字節(jié)操作。例如 strcasecmp(),strtoupper() 和 ucfirst()。這意味著這些函數(shù)只能用于單字節(jié)編碼,而且編碼要與區(qū)域匹配。例如 strtoupper("á") 在區(qū)域設(shè)定正確并且 á 是單字節(jié)編碼時(shí)會(huì)返回 "á"。如果是用 UTF-8 編碼則不會(huì)返回正確結(jié)果,其結(jié)果根據(jù)當(dāng)前區(qū)域有可能返回?fù)p壞的值。
- 一些函數(shù)會(huì)假定字符串是使用某特定編碼的,通常是 UTF-8。intl 擴(kuò)展和 PCRE(上例中僅在使用了 u 修飾符時(shí))擴(kuò)展中的大部分函數(shù)都是這樣。盡管這是由于其特殊用途,utf8_decode() 會(huì)假定 UTF-8 編碼而 utf8_encode() 會(huì)假定 ISO-8859-1 編碼。
Array 數(shù)組
PHP 中的數(shù)組實(shí)際上是一個(gè)有序映射。映射是一種把 values 關(guān)聯(lián)到 keys 的類型。此類型在很多方面做了優(yōu)化,因此可以把它當(dāng)成真正的數(shù)組,或列表(向量),散列表(是映射的一種實(shí)現(xiàn)),字典,集合,棧,隊(duì)列以及更多可能性。由于數(shù)組元素的值也可以是另一個(gè)數(shù)組,樹(shù)形結(jié)構(gòu)和多維數(shù)組也是允許的。
- 可以用 array() 語(yǔ)言結(jié)構(gòu)來(lái)新建一個(gè)數(shù)組。它接受任意數(shù)量用逗號(hào)分隔的 鍵(key) => 值(value)對(duì)。
array( key => value
, ...
)
// 鍵(key)可是是一個(gè)整數(shù) integer 或字符串 string
// 值(value)可以是任意類型的值
- 自 5.4 起可以使用短數(shù)組定義語(yǔ)法,用 [] 替代 array()。
<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
);
// 自 PHP 5.4 起
$array = [
"foo" => "bar",
"bar" => "foo",
];
?>
key 可以是 integer 或者 string。value 可以是任意類型。
- 包含有合法整型值的字符串會(huì)被轉(zhuǎn)換為整型。
例如鍵名 "8" 實(shí)際會(huì)被儲(chǔ)存為 8。但是 "08" 則不會(huì)強(qiáng)制轉(zhuǎ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)換為空字符串,
即鍵名 null 實(shí)際會(huì)被儲(chǔ)存為 ""。
- 數(shù)組和對(duì)象不能被用為鍵名。
堅(jiān)持這么做會(huì)導(dǎo)致警告:Illegal offset type。
如果在數(shù)組定義中多個(gè)單元都使用了同一個(gè)鍵名,則只使用了最后一個(gè),之前的都被覆蓋了。
<?php
$array = array(
1 => "a",
"1" => "b",
1.5 => "c",
true => "d",
);
var_dump($array);
?>
key 為可選項(xiàng)。如果未指定,PHP 將自動(dòng)使用之前用過(guò)的最大 integer 鍵名加上 1 作為新的鍵名。
可以只對(duì)某些單元指定鍵名而對(duì)其它的空置。
用方括號(hào)語(yǔ)法訪問(wèn)數(shù)組單元
數(shù)組單元可以通過(guò) array[key] 語(yǔ)法來(lái)訪問(wèn)。
方括號(hào)和花括號(hào)可以互換使用來(lái)訪問(wèn)數(shù)組單元。
自 PHP 5.4 起可以用數(shù)組間接引用函數(shù)或方法調(diào)用的結(jié)果。之前只能通過(guò)一個(gè)臨時(shí)變量。
自 PHP 5.5 起可以用數(shù)組間接引用一個(gè)數(shù)組原型。
試圖訪問(wèn)一個(gè)未定義的數(shù)組鍵名與訪問(wèn)任何未定義變量一樣:會(huì)導(dǎo)致 E_NOTICE 級(jí)別錯(cuò)誤信息,其結(jié)果為 NULL。
<?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();
?>
用方括號(hào)的語(yǔ)法新建/修改
如果 $arr 還不存在,將會(huì)新建一個(gè),這也是另一種新建數(shù)組的方法。 [] 實(shí)際上代表著字符串訪問(wèn)運(yùn)算符。
$arr[key] = value;
$arr[] = value;
// key 可以是 integer 或 string
// value 可以是任意類型的值
要修改某個(gè)值,通過(guò)其鍵名給該單元賦一個(gè)新值。要?jiǎng)h除某鍵值對(duì),對(duì)其調(diào)用 unset() 函數(shù)。
如果給出方括號(hào)但沒(méi)有指定鍵名,則取當(dāng)前最大整數(shù)索引值,新的鍵名將是該值加上 1(但是最小為 0)。如果當(dāng)前還沒(méi)有整數(shù)索引,則鍵名將為 0。
<?php
$arr = array(5 => 1, 12 => 2);
$arr[] = 56; // This is the same as $arr[13] = 56;
// at this point of the script
$arr["x"] = 42; // This adds a new element to
// the array with key "x"
unset($arr[5]); // This removes the element from the array
unset($arr); // This deletes the whole array
?>
最大整數(shù)鍵名不一定當(dāng)前就在數(shù)組中。它只要在上次數(shù)組重新生成索引后曾經(jīng)存在過(guò)就行了。
<?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);
?>
實(shí)用函數(shù)
unset() 函數(shù)允許刪除數(shù)組中的某個(gè)鍵。但不會(huì)重建索引。如果需要?jiǎng)h除后重建索引,可以用 array_values() 函數(shù)。
foreach 控制結(jié)構(gòu)是專門(mén)用于數(shù)組的。它提供了一個(gè)簡(jiǎn)單的方法來(lái)遍歷數(shù)組。
<?php
$a = array(1 => 'one', 2 => 'two', 3 => 'three');
unset($a[2]);
/* will produce an array that would have been defined as
$a = array(1 => 'one', 3 => 'three');
and NOT
$a = array(1 => 'one', 2 =>'three');
*/
$b = array_values($a);
// Now $b is array(0 => 'one', 1 =>'three')
?>
數(shù)組做什么和不做什么
應(yīng)該始終在用字符串表示的數(shù)組索引上加上引號(hào)。
不要再鍵名為常量或變量的加上引號(hào),否則會(huì)使 PHP 不能解析它們。
<?php
$foo[bar] = 'enemy';
echo $foo[bar];
// etc
?>
這樣是錯(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' 并使用之。
打開(kāi) error_reporting 來(lái)顯示 E_NOTICE 級(jí)別的錯(cuò)誤(將其設(shè)為 E_ALL)時(shí)將看到這些錯(cuò)誤。默認(rèn)情況下 error_reporting 被關(guān)閉。
用函數(shù)返回值作為數(shù)組索引的例子。PHP 也可以用已知常量,
<?php
$error_descriptions[E_ERROR] = "A fatal error has occured";
$error_descriptions[E_WARNING] = "PHP issued a warning";
$error_descriptions[E_NOTICE] = "This is just an informal notice";
?>
兩者是一樣的
<?php
$error_descriptions[1] = "A fatal error has occured";
$error_descriptions[2] = "PHP issued a warning";
$error_descriptions[8] = "This is just an informal notice";
?>
不建議使用php保留字
轉(zhuǎn)換為數(shù)組
-
對(duì)于任意 integer,float,string,boolean 和 resource 類型,如果將一個(gè)值轉(zhuǎn)換為數(shù)組:
將得到一個(gè)僅有一個(gè)元素的數(shù)組,其下標(biāo)為 0,該元素即為此標(biāo)量的值。
(array)$scalarValue 與 array($scalarValue)
-
如果一個(gè) object 類型轉(zhuǎn)換為 array:
結(jié)果為一個(gè)數(shù)組
其單元為該對(duì)象的屬性
鍵名將為成員變量名
整數(shù)屬性不可訪問(wèn)
私有變量前會(huì)加上類名作前綴
保護(hù)變量前會(huì)加上一個(gè) '*' 做前綴。這些前綴的前后都各有一個(gè) NULL 字符
<?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());
?>