5️⃣Array
(陣列):PHP中的陣列實際上是一個有序對映。對映是一種把 values , 關聯到 keys 的型別。 此型別在很多方面做了優化,因此可以把它當成真正的陣列,或列表(向量),雜湊表(對映的一種實現), 字典, 集合, 棧, 佇列以及更多可能性。由於陣列的元素的值可以是另一個陣列,樹形結構和多維陣列也是允許的
-
(一) 定義陣列:
可以使用
array()
語言結構來新建一個陣列,它接受任意數量用逗號分隔的鍵
(key
) =>值
(value
) 對。
example1.php
//陣列的宣告:
$array1 = array('key' => 'value');
$array2 = ['name' => 'monkey']; //PHP5.4 以後可以使用 [],來宣告陣列;
注意:
- 鍵(key) 可以是一個整數(
integer
) 型別,也可以是字串 (string
) 型別;- 值(
value
) 可以是任意型別的值;- 鍵(
key
)會有以下的強制轉換:
- 包含合法整型值得字串會被轉換為整型。例如:鍵名
"8"
實際會被儲存為8
。但是"08"
則不會強制準換,因為其不是一個合法的十進位制數值;- 浮點數也會被轉換成為整型,意味著其小數部分會被捨去。例如:鍵名
"8.7"
實際會被儲存為8
;- 布林值也會被轉換成整型。即鍵名
true
實際會被儲存為1
,false
會被儲存為0
;null
會被轉換成空字串 。 即鍵名會被轉換成''
;- 陣列和物件不能用作鍵名。會導致警告錯誤
Illegal offset type
;如果在陣列定義中多個單元都使用了同一個鍵名,則只使用了最後一個,之前的都被覆蓋了;
example2.php
//型別強制轉換與覆蓋
<?php
$array = array(
1 => "a",
"1" => "b",
1.5 => "c",
true => "d",
);
var_dump($array);
/**
執行結果是:
array(1) {
[1]=>
string(1) "d"
}
**/
?>
php陣列可以同時含有
integer
和string
型別的鍵名,因為PHP實際並不區分索引陣列和關聯陣列。
如果對給出的值沒有指定鍵名,則取出當前最大的整數索引值,而新的鍵名將是該值加一。如果指定的鍵名已經有了值,則該值會被覆蓋;
example3.php
//混合 integer 和 string 的鍵名
$array = array(
"foo" => "bar",
"bar" => "foo",
100 => -100,
-100 => 100,
);
var_dump($array);
/**
以上會輸出:
array(4) {
["foo"]=>
string(3) "bar"
["bar"]=>
string(3) "foo"
[100]=>
int(-100)
[-100]=>
int(100)
}
**/
key
是可選項,如果未指定。PHP將自動使用之前用過的最大integer
鍵+1
作為新的鍵名;
example4.php
//沒有鍵名的索引陣列
<?php
$array = array("foo", "bar", "hallo", "world");
var_dump($array);
?>
/** 以上會輸出
array(4) {
[0]=>
string(3) "foo"
[1]=>
string(3) "bar"
[2]=>
string(5) "hallo"
[3]=>
string(5) "world"
}**/
可以只對某些單元指定鍵名,其他的不指定鍵名;
example5.php
<?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"
}
**/
最後一個值
d
被自動賦予鍵名7
, 是因為之前最大的整數鍵名是6
;
-
訪問陣列單元:
可以使用
[]
的語法來訪問陣列中的單元;
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"]);
/**
以上會輸出:
string(3) "bar"
int(24)
string(3) "foo"
**/
注意:方括號
[]
和花括號{}
可以互換使用來訪問陣列單元, (例如:$array[43]
和$array{43}
在上例項中效果相同
);
- 使用方括號的語法 新建 / 修改 陣列:
可以通過明示的設定其中的值來修改一個已有的陣列;
這是通過在方括號內指定鍵名來給陣列賦值實現的。也可以省略鍵名,在這種情況下給變數名加上一對空的方括號[]
;
$arr[key] = value;
$arr[] = value;
// key 可以是 integer 或 string
// value 可以是任意型別的值
如果
$arr
還不存在,則會新建一個。
要修改某個值,通過其鍵名給該單元賦一個新值。要刪除某鍵值對,對其呼叫unset()
函式;此處暫不細說陣列操作函式,後期詳細說明;
example7.php
<?php
$arr = array(5 => 1, 12 => 2);
$arr[] = 56; // 增加一個鍵名是 13 的單元 $arr[13] = 56;
$arr["x"] = 42; // 增加一個 鍵名是 "x" 的單元
unset($arr[5]); // 刪除掉 $arr 陣列中 鍵名是 5 的單元
unset($arr); // 刪除整個陣列 $arr
?>
如果給出方括號但沒有指定鍵名,則取當前最大整數索引值,新的鍵名將是該值
+ 1
(但是最小為 0)。如果當前還沒有整數索引,則鍵名將為0
。注意:這裡所使用的最大整數鍵名
不一定
就在當前陣列中。它只要在上次陣列重新生成索引後,曾經存在過就行了;(有點繞,看示例);
example8.php
<?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
)
理論聽著可能比較繞,但容易理解;
注意:強烈不建議
$arrp[bar]
這樣寫,而是要寫成$arr['bar']
;注意陣列中單元中使用""
或者''
;
- 這樣是錯的,但可以正常執行。那麼為什麼錯了呢?原因是此程式碼中有一個未定義的常量(bar)而不是字串('bar'-注意引號),而 PHP 可能會在以後定義此常量,不幸的是你的程式碼中有同樣的名字。它能執行,是因為 PHP 自動將裸字串(沒有引號的字串且不對應於任何已知符號)轉換成一個其值為該裸字串的正常字串。例如,如果沒有常量定義為 bar,PHP 將把它替代為 'bar' 並使用之。
- 也許有一天,PHP 開發小組可能會想新增一個常量或者關鍵字,或者使用者可能希望以後在自己的程式中引入新的常量,那就有麻煩了。例如已經不能這樣用 empty 和 default 這兩個詞了,因為他們是
保留字
- 轉換為陣列:
- 對於任何型別
integer
,float
,boolean
,resource
型別,如果建一個值轉換成陣列,將得到一個僅有一個元素的陣列,其鍵名是0
,該元素即為此標量的值。 (array)$scalarValue
與array($scalarValue)
完全一樣。- 如果一個
object
型別轉換成一個array
型別,則結果為一個陣列,其單元為該物件的屬性。鍵名將為成員變數名,不過有幾點例外:- 整數屬性不可訪問;
- 私有變數前會加上類名作字首;
- 保護變數前會加上一個
""
作字首。這些字首的前後都各有一個null
字元,這回導致一些不可預知的行為:
- 對於任何型別
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());
?>
/**
執行結果
array(3) {
["BA"]=>
NULL
["AA"]=>
NULL
["AA"]=>
NULL
}
**/
- 將 NULL 轉換為
array
會得到一個空的陣列。
6️⃣object
物件:
要建立一個物件
object
,需要使用new
語句來例項化;(後期詳細說類和物件
);
轉換成物件:
- 將一個物件轉換成物件,它將不會有任何的變化;
- 如果其他任何型別的值轉換成物件,將會建立一個內建類
stdClass
的例項。- 如果
null
轉換成物件,則新例項為空;array
轉換成object
將使用鍵名稱為屬性名並具有相對應的值,除了數字鍵,不迭代就無法被訪問;
$obj = (object) array('1' => 'foo');
var_dump(isset($obj->{'1'})); // bool(false)
var_dump(key($obj)); // int(1)
對於其他值,會包含進成員變數名:
<?php
$obj = (object) 'ciao';
var_dump($obj);
/**
object(stdClass)#1 (1) {
["scalar"]=>
string(4) "ciao"
}
**/
echo $obj->scalar; // 輸出 'ciao'
7️⃣ NULL
:
特殊的
NULL
值表示一個變數都沒有。NULL
型別唯一可能的值就是null
;
以下情況變數會被認為是 NULL
:
- 被賦值為
NULL
;- 為宣告的變數;
- 被
unset()
的變數;
-
語法:
NULL
型別只有一個值,就是不區分大小寫的常量NULL
; - 轉換到
NULL
:使用
unset
函式將一個變數轉換成NULL
, 將不會刪除該變數或unset
其值。僅是返回NULL
而已;
8️⃣ resource
資源:
資源是以一個特殊的變數,儲存了到外部資源的一個引用。資源是通過專門的函式來建立和使用的。
以後說資源的相關函式及其相應資源型別;
轉換為資源:
由於資源型別變數儲存有為開啟檔案、資料庫連線、圖形畫布區域等的特殊控制程式碼,因此將其它型別的值轉換為資源沒有意義。
以上就是 PHP資料型別
的全部內容,歡迎糾錯和補充,感謝!!!
相關題目:
<?php
//寫出PHP的超全域性變數(陣列),並解釋每個的含義;
?>