《PHP技術大全·第一卷》之數組 Array 細緻解讀

本文使用 markdown 格式編寫,永久更新地址:https://gitee.com/nodestudy/phpgod/blob/master/zh/02.4.md

《PHP技術大全·第一卷》之不可翻篇的基礎再鞏固

---

### 數組 Array 細緻解讀

- 跟其它語言的區別

> 學習過其它編程語言如 Java,C 等同學應該知道,這些語言的數組擁有以下兩大特點:

1. 數組索引必須為整數,並且默認從0開始計算;

2. 數組元素值必須為同一種類型。

- 官方介紹

> PHP 數組實際上是一個有序的映射(map),映射是一種把多個值(values)關聯到對應的多個鍵(keys)的類型。這種映射類型在很多方面做了優化,因此可以把它當成真正的數組(就是上面說的其它編程語言的數組),或列表(向量)(list(vector)),散列表(hashTable),字典(dict),集合(collection),棧(stack),隊列(queue)以及更多的可能,這些都是比較常用的數據結構。由於數組的元素值又可以是一個數組,因此樹形結構和多維數組也是被允許的。當然,如果同學們想了解更多關於數據結構的知識,建議購買 C語言描述《數據結構與算法》一書,在這裡筆者就不做過多介紹了。

- 數組鍵(key)的約定

> PHP數組的鍵(key)可以是整型或者字符串類型,而值(value)可以是任意類型。

如果你給數組的鍵不是整型或者字符串類型,則PHP會在內部對鍵的進行類型轉換(Type Casting),通過下面的代碼示例我們來看下 PHP 是如何進行數組鍵的類型轉換的。

```php

//1. 合法的整數字符串會被轉換成對應的整數鍵,必須滿足「/\-?[1-9]\d*/」正則的標準整數字符串才會被轉換

$array1 = ["10"=>"PHP技術大全"];//被轉換:鍵從字符串"10"轉換成整型10

//$array1 = ["+10"=>"PHP技術大全"];//不被轉換

//$array1 = ["-10"=>"PHP技術大全"];//被轉換:鍵從字符串"-10"轉換成整數-10

//$array1 = ["10.1"=>"PHP技術大全"];//不被轉換:這種包含小數的字符串是不會轉換的,僅限整型

//$array1 = ["010"=>"PHP技術大全"];//不被轉換:這種不是合法的整型也是不會轉換的

//2. 浮點類型的鍵也會被轉換成整形,小數部分將被捨棄

$array2 = [12.3=>"PHP技術大全"];//鍵從浮點數12.3到12

//$array2 = [-12.3=>"PHP技術大全"];//鍵從浮點數-12.3到-12

//3. 布爾類型的鍵也會被轉換成整型,true轉換為1,false轉換為0

$array3 = [true=>"PHP技術大全",false=>"微信公眾號"];//轉換為[0=>"PHP技術大全",1=>"微信公眾號"]

//4. null的鍵會被轉換為""(空字符串)

//5. 其它類型不能用於作為鍵,如果這樣做會導致 PHP 一個錯誤: "Warning:Illegal offset type"

```

- 數組常見用法

1. 給數組末尾追加值

`$array[] = "value";`,請不要使用`array_push($array,"value");`,因為前者性能會高出很多而且語法簡潔。

2. list 訪問數組值

`list($v1,$v2,$v3) = ["key1"=>"value1","key2"=>"value2"];`,這樣就很快給變量賦值了。

3. 訪問字符串的指定位置的字符

`$str = "Welcome to follow me!"; echo $str[0];//output:W`,但是字符串並非數組,這裡只是 PHP 提供的便捷訪問字符串中的字符的一種方式

4. 完全刪除數組中指定索引的元素

`$array = ["hello","hi","nihao"]; unset($array[0]);`,這裡要注意最好得到的是`[1=>"hi",2=>"nihao"]`而不是`[0=>"hi",1=>"nihao"]`,另外,我們不能對字符串指定索引的字符進行unset,例如`$demoStr="hello";unset($demoStr[1]);`會導致報錯並且不會產生任何效果

5. 訪問忘記給數組鍵加引號訪問數組

`$array = ["hi"=>"hello"]; echo $array[hi]; $array[nihao]="你好";`,由於 hi 和 nihao 都忘記添加引號,因此 PHP 會報 E_NOTICE 級別的通知錯誤,會但在生產環境下通常 notice 的報錯通常會被隱藏,但是呢,PHP 還是會默默地在背後給你做一件事,那就是把定義兩個常量:`define("hi","hi");define("nihao","nihao");`,但是錯誤信息還是持續報出來(實現設置`error_reporting(E_ALL);`):「PHP Notice: Use of undefined constant nihao」

- 強制轉換為數組類型

1. 可以對整數,浮點數,字符串,布爾,資源(resource)類型進行強制轉換,轉換結果示例:

```php

$someType = 1;

$someTypeArray = (array)$someType;//轉換結果:$anyTypeArray = [$someType]

```

2. 將一個object對象轉換成數組會比較神奇,規則如下:

> 1. 若為 public 則對象屬性名就會成為數組的鍵;

2. 若為 protected 則對象屬性名就會在前面帶上一個 null(\0)字符,然後接上一個 * 字符,最後在對象屬性前面增加一個 null 字符,於是就組合對應的數組鍵;

3. 若為 private 則對象屬性名會在前面帶上一個 null 字符,然後接上最後一次集成的屬性所屬的類名,接著又是一個 null 字符,於是就組合成了對應的數組鍵;

示例如下:

```php

class O{

private $A = 1;

private $f;

}

class A extends O{

protected $A;

}

class B extends A{

protected $A;

public $c;

}

var_dump((array)new B());

//輸出結果如下,規律還是比較明顯的:

/*

array(6) {

["\0*\0A"]=>

NULL

["c"]=>

NULL

["\0*\0D"]=>

NULL

["\0O\0f"]=>

NULL

["\0*\0c1"]=>

NULL

["\0O\0A"]=>

int(1)

}

*/

```

- 數組元素的修改

我們可以使用 PHP 引用的來對數組進行修改,代碼示例:

```php

$array = [1,2,3];

foreach($array as $k=> &$number){//在 $number 前面加了&(引用符號)

//接下來修改 $number 的值將會對 $array 元素值產生改變

}

//上面的代碼實際相當於做了下面的操作

$number = &$array[$k];

//接下來修改 $number 將會對 $array 產生影響

```

- 最佳實踐

1. PHP 數組包含很多實用的函數,請參考[數組函數](https://secure.php.net/manual/en/ref.array.php),記憶一些百利而無一害;

2. PHP 數組通常關係著系統的性能,所以在定義函數的時候,如果數組參數能夠傳引用就可以減少性能損耗,因為有時候數組參數會比較大;

[目錄](README.md) |[上一節](02.3.md) |[下一節](02.5.md)


分享到:


相關文章: