《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)


分享到:


相關文章: