PHP常用的数组函数
一、array_diff 计算数组的差集
- 语法
array_diff(array $array, array ...$arrays) : array
- 参数
array: 要被比对的数组
arrays: 更多比较的数组
- 返回值
该函数的返回值是一个数组,该数组中包含了在array中但是不在其他数组中的值。值得注意的是,返回的值它对应的键名不会改变,即:保留原数组的键。
- 案例
$array1 = ["name" => '张三', "李四", "王五", "赵六"];
$array2 = ["nick" => '张五', "赵六", "李四", "柱子"];
$result = array_diff($array1, $array2);
echo print_r($result, true); // Array ( [name] => 张三 [1] => 王五 )
二、array_diff_assoc带索引检查计算数组的差集
- 语法
array_diff_assoc(array $array, array ...$arrays) : array
参数
array: 要被比对的数组
arrays: 更多比较的数组返回值
返回一个数组,其中包含array中所有其他数组中不存在的所有值。注意和array_diff()
不同的是键名也用于比较。案例
$array1 = ["name" => '张三', "李四", "王五", "赵六"];
$array2 = ["nick" => '张三', "李四", "狗子", "柱子"];
$result1 = array_diff($array1, $array2);
echo print_r($result1, true)."<br>"; // Array ( [1] => 王五 [2] => 赵六 )
$result2 = array_diff_assoc($array1, $array2);
echo print_r($result2, true); // Array ( [name] => 张三 [1] => 王五 [2] => 赵六 )
通过上述array_diff()
和array_diff_assoc()
两个函数的结果可以看出,array1
的键值对"name" => "张三"
和array2
的键值对"nick" => "张三"
它们的值都是相等的,但是键名不同,所以在array_diff_assoc()
函数中还是会输出该值。相当于使用了严格检查模式。
三、array_intersect_assoc 带索引检查计算数组的交集
- 语法
array_intersect_assoc(array $array, array …$arrays) : array
- 参数
array: 要检查的数组,该数组作为主值
arrays: 要被对比的数组列表
- 返回值
返回一个数组,该数组包含了在array
中也同时出现在所有其它参数数组中的值。注意和array_intersect()
不用的是键名也用于比较。
- 案例
$array1 = ["name" => '张三', "李四", "王五", "赵六"];
$array2 = ["nick" => '张三', "李四", "赵六", "柱子"];
$result = array_intersect_assoc($array1, $array2);
echo print_r($result, true); // Array ( [0] => 李四 )
以上代码只会输出[0] => 李四
,因为只有array2
中李四的键值对
与array1
中的完全相等。
五、array_merge()合并一个或多个数组
- 语法
array_merge(array …$arrays) : array
- 参数
arrays: 要合并的一个或多个数组
- 返回值
返回一个合并后的结果数组。
- 注意
如果输入的数组中有相同的字符串键名,那么后者的值将覆盖前者,但是如果数组包含数字键名,后面的值将不会覆盖原来的值,而是会附加在数组后面。
- 案例
$array1 = ['color' => 'blue', 3, 5];
$array2 = ['a', 5, 'color' => 'red', 10];
print_r(array_merge($array1, $array2));
// 结果:
// // Array ( [color] => red [0] => 3 [1] => 5 [2] => a [3] => 5 [4] => 10 )
六、array_combine()合并两个数组,其中一个数组的值作为新数组的键,另外一个数组的键作为新数组的值
- 语法
array_combine(array $keys, array $values) : array
- 参数
keys: 要当做新数组的键。
values: 要当做新数组的值。
- 返回值
返回一个新数组,如果两个数组的数量不一样将返回false。
- 案例
以下代码会报错:array_combine(): Both parameters should have an equal number of elements
$array1 = ['color' => 'blue', 3, 5];
$array2 = ['a', 5, 'color' => 'red', 10];
print_r(array_combine($array1, $array2));
- 结果图:
正确的代码应该是下面的:
$array1 = ['color' => 'blue', 3, 5];
$array2 = ['a', 5, 'color' => 'red'];
print_r(array_combine($array1, $array2)); // Array ( [blue] => a [3] => 5 [5] => red )
这里有一点值得注意的是:两个数组的单元数量必须是一致的,否则,就会报错。
七、array_flip()交换数组的键和值
- 语法
array_combine(array $array) : array
- 参数
array: 需要交换键值对的数组。
- 返回值
成功后返回一个交换了键值对的新数组,如果失败则返回null。
- 案例
$array = ['name' => '残破的蛋蛋', 'age' => 30];
$newArray = print_r(array_flip($array), true);
print_r($newArray)."<br>"; // Array ( [残破的蛋蛋] => name [30] => age )
// 该方法不会改变原有数组。
print_r($array); // Array ( [name] => 残破的蛋蛋 [age] => 30 )
注意:该方法不会改变原有数组。
八、array_multisort()对多个数组或多维数组进行排序
- 语法
array_multisort(array &$array1, mixed $array1_sort_order = SORT_ASC, …$array) : array
- 参数
array1: 要排序的数组。
array1_sort_order:排序方式。SORT_ASC:按照升序排序,SORT_DESC按照降顺序排序。
…$array:可选项,提供更多数组参与排序,提供的数组需要和array1
要有相同数量的元素。
- 返回值
成功返回值ture,失败返回false。
- 案例
以下是一组从Redis中查询出来的购物车数据列表:
$cart_lists = Array
(
0 => Array
(
'title' => '黑色连裤袜女显瘦中厚丝袜',
'image' => 'http://localhost:8082/upload/image/20201116\a6641df33b4e2507c562e7ed7b3b39ee.jpg',
'num' => '1',
'goods_id' => 88,
'create_time' => '1612083130',
'id' => 140,
'price' => 13.90,
'total_price' => 13.9,
'sku' => '颜色 款式:黑色1条装 款式:踩脚款【高弹力70-135斤】'
),
1 => Array
(
'title' => '黑色连裤袜女显瘦中厚丝袜',
'image' => 'http://localhost:8082/upload/image/20201116\a6641df33b4e2507c562e7ed7b3b39ee.jpg',
'num' => 1,
'goods_id' => 88,
'create_time' => 1612083133,
'id' => 141,
'price' => 9.90,
'total_price' => 9.9,
'sku' => '颜色 款式:黑色1条装 款式:九分款【高弹力70-135斤】'
),
2 => Array
(
'title' => '黑色连裤袜女显瘦中厚丝袜',
'image' => 'http://localhost:8082/upload/image/20201116\a6641df33b4e2507c562e7ed7b3b39ee.jpg',
'num' => 3,
'goods_id' => 88,
'create_time' => 1612082911,
'id' => 130,
'price' => 16.90,
'total_price' => 50.7,
'sku' => '颜色 款式:黑色5条装16.9 款式:连裤款【高弹力70-135斤】',
),
4 => Array
(
'title' => '黑色连裤袜女显瘦中厚丝袜',
'image' => 'http://localhost:8082/upload/image/20201116\a6641df33b4e2507c562e7ed7b3b39ee.jpg',
'num' => 1,
'goods_id' => 88,
'create_time' => 1612082923,
'id' => 133,
'price' => 16.90,
'total_price' => 16.9,
'sku' => '颜色 款式:黑色3条装12.9 款式:连裤款【高弹力70-135斤】'
)
);
现在我们需要按照用户添加的时间倒序排列购物车里的数据,也就是把最新添加的商品显示在最前面。
$array_column = array_column($cart_lists, "create_time");
print_r($array_column); // Array ( [0] => 1612083130 [1] => 1612083133 [2] => 1612082911 [3] => 1612082923 )
array_multisort($array_column, SORT_DESC, $cart_lists);
print_r($cart_lists);
- 效果图:
注意:array_multisort()
函数的返回值是ture和false,它是直接在原数组上进行的修改,所以如果要是输出排序后的数组,直接打印原数组即可。
九、array_product()计算数组中所有值的乘积
- 语法
array_product(array $array) : number
- 参数
array: 参与计算乘积的数组。
- 返回值
以整数或浮点数返回一个数组中所有值的乘积。
- 案例
$a = array(2, 4, 6, 9);
echo sprintf('array数组的所有值的乘积是:%d', array_product($a)); // array数组的所有值的乘积是:432
以上结果会输出:array数组的所有值的乘积是:432
。
十、array_sum()计算数组中所有值的和
- 语法
array_sum(array $array) : number
- 参数
array: 参与计算和的数组。
- 返回值
以整数或浮点数返回一个数组中所有值的和。
- 案例
$a = array(2, 4, 6, 9);
echo sprintf('array数组的所有值的和是:%d', array_sum($a)); // array数组的所有值的和是:21
十一、array_replace()使用传递的数组替换第一个数组的元素
- 语法
array_replace(array $array, array $replacement) : array
array_replace()
函数使用后面数组元素相同的key值替换前面的数组元素。如果一个键在同时存在于两个数组中,第一个数组中的值将被第二个数组中的值替换掉。
如果一个键存在于第二个数组中,但不存在于第一个数组中,则会在第一个数组中创建这个元素。如果一个键仅存在于第一个数组中,它将保持不变。如果同时传递了多个数组,它们
将被依次处理,后面的数组覆盖前面的值。
- 参数
array: 被替换的数组。
replacement: 要替换前面数组的数组。
- 返回值
返回的是一个被替换之后的数组,如果发生错误将返回null。
- 案例
$array = ['blue', 'yellow', 'red', 'lightgreen'];
$replacement1 = [0 => 'blue', 'black', 2 => 'yellow', 4 => 'voilet'];
$replacement2 = [2 => 'green'];
print_r(array_replace($array, $replacement1, $replacement2));
以上结果会输出:Array ( [0] => blue [1] => black [2] => green [3] => lightgreen [4] => voilet )
。
十二、array_unique()移除数组中重复的值
- 语法
array_uniqure(array $array, int $sort_flags = SORT_STRING) : array
array_uniqure()
函数先将值作为字符串排序,然后每个值值保留第一个遇到的键名,接着会忽略后面所有的键名
注意:该方法会保留键名,当且仅当($string) $ele1 === (string) $ele2时,才认为两个元素相同。
- 参数
array: 需要去重的数组。
- 返回值
返回的是一个被过滤之后的新数组。
- 案例1
$array = ['a' => 'blue', 'b' => 'yellow', 'blue', 'red', 'green', 'lightgreen'];
$result = array_unique($array, SORT_LOCALE_STRING);
print_r($result);
以上代码会输出:Array ( [a] => blue [b] => yellow [1] => red [2] => green [3] => lightgreen )
。
- 案例2
$array = [4, "3", 1, 4, "2", "4", 2, 3];
$result = array_unique($array, SORT_NUMERIC);
print_r($result);
以上代码会输出:Array ( [0] => 4 [1] => 3 [2] => 1 [4] => 2 )
。