PHP数组备忘录

121 阅读2分钟

在PHP中,有数值数组关联数组,分别对应着其他编程语言的数组(list)哈希表(map)。另外,PHP的关联数组的写法也比较特别,使用=>代替了:,比如:

# 其他语言的写法:
arr2 = {'aa': 1, 'bb': 2}

# PHP的写法
$arr2 = ['aa' => 1, 'bb' => 2];

此外,在PHP中,并没有严格区分数值数组和关联数组,两者都被视为数组,类型为array

$arr1 = ['aa', 'bb'];
$arr2 = ['aa' => 1, 'bb' => 2];

var_dump(gettype($arr1));  // array
var_dump(gettype($arr2));  // array

如何声明并赋值一个数组呢,可以通过以下两种方式:

$arr1 = []; // 空数组

$arr2 = array(); // 空数组

类似于字符串,PHP的数组也提供了很多的便捷函数,这些函数可以在菜鸟教程中找到,这里不做赘述。

本文主要重点讲述自己日常高频使用的 Array函数,以及踩过的一些坑。

1、array_chunk

该函数会将一个数据按指定的数量进行等分,生成新的数组(二维数组)。在进行一些批量操作的时候,有时候数据量太大,就可以通过这个函数设置批量操作的最大值,并分批插入

$arr2 = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'];

/*
[
	['1', '2', '3'],
	['4', '5', '6'],
	['7', '8', '9'],
	['10']
]
*/
var_dump(array_chunk($arr2, 3));

注:我的输出并没有跟PHP的输出保持一致,而是采用肉眼容易可读的方式,下文同理。

2、array_column

该函数获取二维数组中某个单一列的值,也是一个非常高频使用的函数。我们从数据库获取一批数据后,如果想要这批数据的某一个字段(比如ID列表),就可以用这个函数。

$arr = [
            ['id'   => '1011', 'name' => 'aa'],
            ['id'   => '1012', 'name' => 'bb']
        ];
// ['1011', '1012']
var_dump(array_column($arr, 'id'));

3、array_key_exists

该函数用于判断某个数组中是否存在指定的键名,如果键名存在则返回 true,如果键名不存在则返回 false。

$arr = ['1', '2', '3'];
// true
var_dump(array_key_exists('2', $arr));

$arr = ['id' => '1011', 'name' => 'aa'];
// true
var_dump(array_key_exists('id', $arr));
// false
var_dump(array_key_exists('other', $arr));

$arr = [
    ['id' => '1011', 'name' => 'aa'],
    ['id' => '1012', 'name' => 'bb']
];
// false
var_dump(array_key_exists('id', $arr));

4**、in_array**

判断数组中是否存在指定的值,和 array_key_exists 非常相似

$arr = ['11', 'aa', 'bb', 'cc'];
// true
var_dump(in_array('aa', $arr));
// true
var_dump(in_array(11, $arr));

# 当 strict 参数为 true,表示严格校验类型
// false
var_dump(in_array(11, $arr, true));

$arr = ['id' => '1011', 'name' => 'aa'];
// true
var_dump(in_array('aa', $arr));

5、array_map

该函数会将指定的函数作用到数组的每个值上,一般在批量修改数据的时候用到(一种简化的写法)。

# 针对list
$arr = [1, 2, 3];
$arr = array_map(function ($num) {
    return $num + 1;
}, $arr);
// [2, 3, 4]
var_dump($arr);

# 针对map(关联数组)
$arr = ['id' => '1011', 'name' => 'aa'];
$arr = array_map(function ($val) {
    return $val . '_map';
}, $arr);
// ['id' => '1011_map', 'name' => 'aa_map']
var_dump($arr);

6、array_slice

这个函数应该是最高频的,作用是对数组进行切片,获取指定范围的数据。

# 语法
# offset:偏移量  length:要获取的长度   preserve_keys:是否保持原来的顺序
array_slice (array $array, $offset, $length = null, $preserve_keys = false)

$arr = [1, 2, 3, 4, 5, 6];
// 虽然获取的值一样,但是通过设置 preserve_keys,得到的索引值是不同的
/*
array(2) {
  [0] =>
  int(3)
  [1] =>
  int(4)
}
*/
var_dump(array_slice($arr, 2, 4));

/*
array(2) {
  [2] =>
  int(3)
  [3] =>
  int(4)
}
*/
var_dump(array_slice($arr, 2, 4, true));

// 该函数很好地处理了数组越界的问题,并不会报错
var_dump(array_slice($arr, 2, 6));  // [3,4,5,6]
var_dump(array_slice($arr, 6, 6));  // []

// 获取最后一个数
var_dump(array_slice($arr, -1));

7、array_unique

该函数用于去重,但是该函数有一个坑:即去重后,并没有对key进行重排,导致list去重后有可能会变成一个map,相信不少人也被其坑过,可以通过加 array_values 函数解决。

$arr = [9, 9, 8, 6, 7];
// [9,9,8,6,7]
var_dump(json_encode($arr));

$arr = array_unique($arr);
// {"0":9,"2":8,"3":6,"4":7}
var_dump(json_encode($arr));

# 一种特殊情况,如果数组里面的值都一样,去重则没有问题
$arr = [1, 1, 1];
$arr = array_unique($arr);
// [1]
var_dump(json_encode($arr));

8、array_values

该函数返回包含数组中所有的值的数组,和array_keys是相反的关系。

// ['1011', 'aa']
$arr = ['id' => '1011', 'name' => 'aa'];
var_dump(array_values($arr));

9**、array_keys**

该函数返回数组中所有的键名,当然,你也可以指定一个关键词,数组的value等于这个关键词的key才返回

# 如果是list,返回的就是索引列表
$arr = ['1', '2', '3'];
// [0, 1, 2]
var_dump(array_keys($arr));

# 如果是map,返回的就是key
$arr = ['id' => '1011', 'name' => 'aa'];
// ['id', 'name']
var_dump(array_keys($arr));

// 通过关键词返回特定的key
var_dump(array_keys($arr, 'aa'));

10、shuffle

随机打乱数组中值的顺序。

$arr = ['11', 'aa', 'bb', 'cc'];
shuffle($arr);
// ['aa', 'bb', '11', 'cc']
var_dump($arr);

PHP数组相关的函数非常之多,这里也只是列举了个人觉得比较高频的十个函数,只是一家之言,如果想查看其他函数,可以在菜鸟教程查看,前面也有提到。