0x00 前言
PHP 的数组是一种很强大的数据类型,与此同时 PHP 内置了一系列与数组相关的函数可以很轻易的实现日常开发的功能。但是我发现好像很多小伙伴都忽略了内置函数的作用(比如我自己就编写过一些有关数组操作的代码然后发现PHP自带了~~,善用 PHP 内置函数能极大的提高开发效率和运行效率(内置函数都是用 C 写的效率比用 PHP 写的高很多),所以本文便总结了一些在常见场景中利用 PHP 内置函数的实现方法。此外如果想更深入的学习有关 PHP 数组函数最好还是去查 PHP 手册!
推荐:《php培训》
0x01 取指定键名
对于某些关联数组,有时候我们只想取指定键名的那部分,比如数组为 ['id' => 1, 'name' => 'zane', 'password' => '123456'] 此时若只想取包含 id 和 name 的部分该怎么实现呢?下面直接贴代码。
<?php$raw = ['id' => 1, 'name' => 'zane', 'password' => '123456'];// 自己用 PHP 实现function onlyKeys($raw, $keys) { $new = []; foreach ($raw as $key => $val) { if (in_array($key, $keys)) { $new[$key] = $val; } } return $new;}// 用 PHP 内置函数实现function newOnl<i style="color:transparent">本文来源gaodai$ma#com搞$$代**码)网8</i><strong>搞代gaodaima码</strong>yKeys($array, $keys) { return array_intersect_key($array, array_flip($keys));}var_dump(onlyKeys($raw, ['id', 'name']));// 结果 ['id' => 1, 'name' => 'zane']var_dump(newOnlyKeys($raw, ['id', 'name']));// 结果 ['id' => 1, 'name' => 'zane']
很明显简洁很多有木有!不过 array_intersect_key 和 array_flip 是什么鬼?这里简单的介绍一下这两个函数的作用,首先是 array_flip 函数,这个函数的功能是「将数组的键和值对调」,也就是键名变成值,值变成键名。我们传递的 $keys 参数经过这个函数便从 [0 => 'id', 1 => 'name'] 转变为了 ['id' => 0, 'name' => 1]。
这样做的目的是为了向 array_intersect_key 函数服务,array_intersect_key 函数的功能是「使用键名比较计算数组的交集」,也就是返回第一个参数数组中与其他参数数组相同键名的值。这样便实现了取指定键名的功能 ~(≧▽≦)/~啦!当然要详细了解这两个函数的功能还是要查 PHP 官方手册:array_flip array_intersect_key
0x02 移除指定键名
有了上一个例子做铺垫,这个就简单讲讲啦,道理是大同小异滴。
<?php$raw = ['id' => 1, 'name' => 'zane', 'password' => '123456'];// 用 PHP 内置函数实现function removeKeys($array, $keys) { return array_diff_key($array, array_flip($keys));}// 移除 id 键var_dump(removeKeys($raw, ['id', 'password']));// 结果 ['name' => 'zane']
和上一个例子相比本例只是将 array_intersect_key 函数改为 array_diff_key,嗯……相信大家能猜出来这个函数的功能「使用键名比较计算数组的差集」,刚好和 array_intersect_key 的功能相反而已。官方手册:array_diff_key
0x03 数组去重
这个相信大家都有这个需求,当然 PHP 也内置了 array_unique 函数供给大家使用,如下例:
<?php$input = ['you are' => 666, 'i am' => 233, 'he is' => 233, 'she is' => 666];$result = array_unique($input);var_dump($result);// 结果 ['you are' => 666, 'i am' => 233]
嘿,用这个函数就能解决大部分问题了,但是有时候你可能会觉得它不够快,原因如下: