PHP常用数组函数,10个必须掌握
前言
PHP数组函数太多了,记不住?本文整理了10个最常用的数组函数,写代码天天用,必须掌握。
一、array_column — 取数组某一列
用法
$users = [
['id' => 1, 'name' => '张三'],
['id' => 2, 'name' => '李四'],
['id' => 3, 'name' => '王五']
];
$names = array_column($users, 'name');
// 结果:['张三', '李四', '王五']
取列并指定键
$userMap = array_column($users, 'name', 'id');
// 结果:[1 => '张三', 2 => '李四', 3 => '王五']
二、array_map — 遍历处理数组
用法
$numbers = [1, 2, 3, 4, 5];
$squares = array_map(function($n) {
return $n * $n;
}, $numbers);
// 结果:[1, 4, 9, 16, 25]
实际应用
// 把所有名字转成大写
$names = ['zhang', 'li', 'wang'];
$upperNames = array_map('strtoupper', $names);
// 结果:['ZHANG', 'LI', 'WANG']
三、array_filter — 过滤数组
用法
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
$even = array_filter($numbers, function($n) {
return $n % 2 == 0;
});
// 结果:[2, 4, 6, 8, 10]
过滤空值
$arr = ['a', '', 0, null, 'b', '0'];
$result = array_filter($arr);
// 结果:['a', 'b']
四、array_merge — 数组合并
用法
$arr1 = ['a', 'b'];
$arr2 = ['c', 'd'];
$merged = array_merge($arr1, $arr2);
// 结果:['a', 'b', 'c', 'd']
关联数组合并
$arr1 = ['name' => '张三', 'age' => 20];
$arr2 = ['age' => 25, 'city' => '北京'];
$merged = array_merge($arr1, $arr2);
// 结果:['name' => '张三', 'age' => 25, 'city' => '北京']
// 注意:age被后面的覆盖了
五、in_array — 判断值是否在数组里
用法
$fruits = ['apple', 'banana', 'orange'];
if (in_array('apple', $fruits)) {
echo '有苹果';
}
注意严格模式
$arr = [1, '2', '3'];
in_array(2, $arr); // true(因为类型转换了)
in_array(2, $arr, true); // false(严格模式)
六、array_keys — 取数组的键
用法
$user = ['name' => '张三', 'age' => 20, 'city' => '北京'];
$keys = array_keys($user);
// 结果:['name', 'age', 'city']
找某个值的键
$ages = [
'张三' => 20,
'李四' => 25,
'王五' => 30
];
$keys = array_keys($ages, 25);
// 结果:['李四']
七、array_values — 取数组的值
用法
$user = ['name' => '张三', 'age' => 20, 'city' => '北京'];
$values = array_values($user);
// 结果:['张三', 20, '北京']
八、array_sum — 数组求和
用法
$numbers = [1, 2, 3, 4, 5];
$sum = array_sum($numbers);
// 结果:15
九、count — 统计数组长度
用法
$fruits = ['apple', 'banana', 'orange'];
$count = count($fruits);
// 结果:3
多维数组
$users = [
['name' => '张三'],
['name' => '李四']
];
count($users); // 2
count($users, COUNT_RECURSIVE); // 4(递归统计)
十、explode / implode — 字符串和数组互转
explode — 字符串转数组
$str = 'apple,banana,orange';
$fruits = explode(',', $str);
// 结果:['apple', 'banana', 'orange']
implode — 数组转字符串
$fruits = ['apple', 'banana', 'orange'];
$str = implode(',', $fruits);
// 结果:'apple,banana,orange'
十一、常用场景
场景1:从数据库取数据,提取某列
$users = Db::name('user')->select();
$names = array_column($users, 'name');
场景2:过滤空值
$list = array_filter($list);
场景3:判断是否存在
if (in_array($userId, $adminIds)) {
// 是管理员
}
场景4:数组去重后转字符串
$tags = array_unique($tags);
$tagStr = implode(',', $tags);
十二、常见坑
坑1:array_merge关联数组键名覆盖
问题: 相同键名会被覆盖。
解决: 用+号或array_replace。
坑2:in_array类型不严格
问题: in_array(0, ['a', 'b'])返回true。
解决: 加第三个参数true,严格模式。
坑3:count返回0
问题: 传了null进去。
解决: 先判断是不是数组。
总结
10个必须掌握的数组函数:
array_column— 取某一列array_map— 遍历处理array_filter— 过滤array_merge— 合并in_array— 判断存在array_keys— 取键array_values— 取值array_sum— 求和count— 统计长度explode/implode— 字符串数组互转
记住:
- 天天用的就是这10个
- 写代码前先想想有没有现成函数
- 别自己写循环,用内置函数更快
遇到问题加QQ23979811 协助处理
PHP 8.3 新特性详解:类型类获取、动态常量获取和更多实用功能
前言
PHP 8.3 于 2023 年 11 月正式发布,作为 PHP 8.x 系列的第四个版本,它带来了一系列实用的语法增强和性能优化。本文将深入介绍 PHP 8.3 中最值得关注的几个新特性。
1. 类型类获取(Typed class constants)
在 PHP 8.3 之前,类常量无法声明类型。从 PHP 8.3 开始,类常量可以指定类型,这有助于提高代码的类型安全性。
class Foo
{
const string BAR = 'bar';
const int MAX_COUNT = 100;
}
声明了类型的常量必须与声明的类型匹配,否则会抛出 TypeError。支持的类型包括:标量类型、array、object、static、self、parent、类名/接口名以及 iterable。
2. 动态类常量获取
PHP 8.3 新增了 constant() 函数的增强,允许通过表达式动态获取类常量:
class Status
{
const DRAFT = 'draft';
const PUBLISHED = 'published';
const ARCHIVED = 'archived';
}
$status = 'PUBLISHED';
echo constant(Status::class . "::$status"); // 输出: published
这在需要根据变量动态选择常量时非常有用,避免了大量的 switch 或 match 分支。
3. #[\Override] 注解
PHP 8.3 引入了 #[\Override] 注解,用于显式标记一个方法是重写父类的方法:
abstract class Controller
{
abstract public function handle(): void;
}
class UserController extends Controller
{
#[\Override]
public function handle(): void
{
echo "Handling user request...";
}
}
如果使用了 #[\Override] 注解,但方法实际上并没有重写任何父类方法(比如方法名拼错了),PHP 会在编译时报错。这在大型项目中非常有价值,可以防止因为方法名不一致导致的隐蔽 bug。
4. Readonly 深拷贝
PHP 8.3 改进了 readonly 属性的处理。在 PHP 8.2 中,readonly 属性不能通过克隆来修改。PHP 8.3 允许在克隆时修改 readonly 属性:
class Point
{
public function __construct(
public readonly int $x,
public readonly int $y
) {}
}
$p1 = new Point(10, 20);
$p2 = clone $p1;
$p2->x = 30; // PHP 8.3 中允许,PHP 8.2 会报错
这个特性在值对象模式中特别有用,可以创建修改后的副本而不影响原始对象。
5. 其他实用改进
json_validate() 函数
PHP 8.3 新增了 json_validate() 函数,用于验证 JSON 字符串是否有效,而不需要解码:
$json = '{"name": "Alice", "age": 30}';
if (json_validate($json)) {
echo "Valid JSON";
}
这比 json_decode() 更高效,因为它不需要分配内存来存储解码后的结果。
随机浮点数
PHP 8.3 的 Random\Randomizer 类新增了 getFloat() 方法:
$r = new Random\Randomizer();
$float = $r->getFloat(0, 10, \Random\IntervalBoundary::ClosedOpen);
总结
PHP 8.3 虽然不是一个大版本更新,但它带来的每一个新特性都直击开发者的日常痛点。类型类常量和 #[\Override] 注解增强了代码的可维护性,动态常量获取简化了代码逻辑,readonly 深拷贝则让值对象模式更加实用。
建议正在使用 PHP 8.x 的项目尽快升级到 8.3,既能获得这些新特性的好处,也能享受性能上的小幅提升。