關於 PHP 的資料型別 (三)

周小帥發表於2018-09-29

資料型別
5️⃣Array (陣列):
PHP中的陣列實際上是一個有序對映。對映是一種把 values , 關聯到 keys 的型別。 此型別在很多方面做了最佳化,因此可以把它當成真正的陣列,或列表(向量),雜湊表(對映的一種實現), 字典, 集合, 棧, 佇列以及更多可能性。由於陣列的元素的值可以是另一個陣列,樹形結構和多維陣列也是允許的

  • (一) 定義陣列:

    可以使用 array() 語言結構來新建一個陣列,它接受任意數量用逗號分隔的 (key) => (value) 對。

example1.php

//陣列的宣告:
$array1 = array('key' => 'value');
$array2 = ['name' => 'monkey']; //PHP5.4 以後可以使用 [],來宣告陣列;

注意

  • 鍵(key) 可以是一個整數(integer) 型別,也可以是字串 (string) 型別;
  • 值(value) 可以是任意型別的值;
  • 鍵( key)會有以下的強制轉換:
    1. 包含合法整型值得字串會被轉換為整型。例如:鍵名 "8" 實際會被儲存為 8。但是 "08" 則不會強制準換,因為其不是一個合法的十進位制數值;
    2. 浮點數也會被轉換成為整型,意味著其小數部分會被捨去。例如:鍵名 "8.7" 實際會被儲存為 8;
    3. 布林值也會被轉換成整型。即鍵名 true 實際會被儲存為 1, false 會被儲存為 0;
    4. null 會被轉換成空字串 。 即鍵名會被轉換成 ''
    5. 陣列和物件不能用作鍵名。會導致警告錯誤 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陣列可以同時含有 integerstring 型別的鍵名,因為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 開發小組可能會想新增一個常量或者關鍵字,或者使用者可能希望以後在自己的程式中引入新的常量,那就有麻煩了。例如已經不能這樣用 emptydefault 這兩個詞了,因為他們是保留字
  • 轉換為陣列:
    • 對於任何型別 integer , float , boolean, resource 型別,如果建一個值轉換成陣列,將得到一個僅有一個元素的陣列,其鍵名是 0 ,該元素即為此標量的值。
    • (array)$scalarValuearray($scalarValue)完全一樣。
    • 如果一個 object 型別轉換成一個 array 型別,則結果為一個陣列,其單元為該物件的屬性。鍵名將為成員變數名,不過有幾點例外:
      1. 整數屬性不可訪問;
      2. 私有變數前會加上類名作字首;
      3. 保護變數前會加上一個 "" 作字首。這些字首的前後都各有一個 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的超全域性變數(陣列),並解釋每個的含義;
?>
本作品採用《CC 協議》,轉載必須註明作者和本文連結
周小帥

相關文章