關(guān)于PHP的數(shù)據(jù)類(lèi)型(三)

數(shù)據(jù)類(lèi)型

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)換:
  1. 包含合法整型值得字符串會(huì)被轉(zhuǎn)換為整型。例如:鍵名 "8" 實(shí)際會(huì)被存儲(chǔ)為 8。但是 "08" 則不會(huì)強(qiáng)制準(zhǔn)換,因?yàn)槠洳皇且粋€(gè)合法的十進(jìn)制數(shù)值;
  2. 浮點(diǎn)數(shù)也會(huì)被轉(zhuǎn)換成為整型,意味著其小數(shù)部分會(huì)被舍去。例如:鍵名 "8.7" 實(shí)際會(huì)被儲(chǔ)存為 8;
  3. 布爾值也會(huì)被轉(zhuǎn)換成整型。即鍵名 true 實(shí)際會(huì)被存儲(chǔ)為 1, false 會(huì)被存儲(chǔ)為 0;
  4. null 會(huì)被轉(zhuǎn)換成空字符串 。 即鍵名會(huì)被轉(zhuǎn)換成 '';
  5. 數(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í)含有 integerstring 類(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)不能這樣用 emptydefault 這兩個(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)$scalarValuearray($scalarValue)完全一樣。
  • 如果一個(gè) object 類(lèi)型轉(zhuǎn)換成一個(gè) array 類(lèi)型,則結(jié)果為一個(gè)數(shù)組,其單元為該對(duì)象的屬性。鍵名將為成員變量名,不過(guò)有幾點(diǎn)例外:
  1. 整數(shù)屬性不可訪(fǎng)問(wèn);
  2. 私有變量前會(huì)加上類(lèi)名作前綴;
  3. 保護(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è)的含義;
?>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容