网站首页 > 知识剖析 正文
PHP 升级到了 8.4,个人觉得对我们写代码帮助最大的就是 PHP 8.4 引入的 array_find()、array_find_key()、array_any() 和 array_all() 这 4 个 array_*() 数组函数。
其实这四个函数在 JavaScript 的 Array 的实例方法中就有了,只是他的命名方式和 PHP 有点不一样,就他是用 every 和 some 而不是 all 和 any,我之前写代码的时候,也有一些地方需要使用到这四个数组函数,所以我基于 JavaScript 的方式在 WPJAM Basic 中集成了这四个方法。
在 PHP 8.4 发布之后我基于 PHP 8.4 命名方式做了一些优化,使得大家在没有升级到 PHP 8.4,也可以提前在 WordPress 中使用 PHP 8.4 引入的数组函数。
array_find()
array_find() 是返回数组中第一个满足回调函数的元素,如果没有则返回 null,根据这个特性,我们很容易就实现这个函数:
if(!function_exists('array_find')){
function array_find($arr, $callback){
foreach($arr as $k => $v){
if($callback($v, $k)){
return $v;
}
}
}
}
比如我在字段处理中,如果字段没有定义类型,我根据它是否有其他属性来给他设置类型的代码,如果没有 array_find,我们一般这么写:
if(!empty($field['options'])){
$field['type'] = 'select';
}elseif(!empty($field['label'])){
$field['type'] = 'checkbox';
}elseif(!empty($field['fields'])){
$field['type'] = 'fieldset';
}else{
$field['type'] = 'text';
}
有了 array_find,一行就搞定了:
$field['type'] = array_find(['options'=>'select', 'label'=>'checkbox', 'fields'=>'fieldset'], fn($v, $k)=> !empty($field[$k])) ?: 'text';
array_find_key()
array_find_key() 和 array_find() 很像,只是它返回数组中第一个满足回调函数的元素的健名:
if(!function_exists('array_find_key')){
function array_find_key($arr, $callback){
foreach($arr as $k => $v){
if($callback($v, $k)){
return $k;
}
}
}
}
相比 array_find() 函数的定义,唯一的区别,它 return 的是 key 而不是 value。
上面的获取字段的类型的代码,也可以使用 array_find_key() 来实现,大家看看区别:
$field['type'] = array_find_key(['select'=>'options', 'checkbox'=>'label', 'fieldset'=>'fields'], fn($v, $k)=> !empty($field[$v])) ?: 'text';
array_all()
array_all() 判断数组中的每个元素是否都满足回调函数,意思是将每个元素传递给回调函数,都要返回 true:
if(!function_exists('array_all')){
function array_all($arr, $callback){
foreach($arr as $k => $v){
if(!$callback($v, $k)){
return false;
}
}
return true;
}
}
比如我写的 SMTP 发信扩展里面就有判断代码,需要「发信地址」,「邮箱账号」和「邮箱密码」这三个选项都设置了之后才生效:
if(array_all(['host', 'user', 'pass'], fn($k)=> WPJAM_SMTP::get_setting($k))){
// 执行代码
}
array_any()
array_any() 也是判断数组的元素是否满足满足回调函数,但是 array_any() 只需要一个满足即可,而 array_all() 一样则是需要全部都满足:
if(!function_exists('array_any')){
function array_any($arr, $callback){
foreach($arr as $k => $v){
if($callback($v, $k)){
return true;
}
}
return false;
}
}
上面例子中,发信设置扩展需要「发信地址」,「邮箱账号」和「邮箱密码」这三个选项都要设置,换成 array_any() 的思维,则只要一个没有设置就返回:
if(array_any(['host', 'user', 'pass'], fn($k)=> !WPJAM_SMTP::get_setting($k))){
return; // 返回,不生效
}
大家对比一下两个例子的代码,使用相类似的例子,通过不同的写法,也是一种更加清晰的区分函数的方式。
标题说了,还没升级到 PHP 8.4,也可以提前在 WordPress 中使用 PHP 8.4 引入的数组函数,意思只要你更新 WPJAM Basic 到最新版就能使用了。
- 上一篇: 如何解决PHP中的数组越界问题?
- 下一篇: PHP8创建数组-PHP8知识详解
猜你喜欢
- 2025-01-07 PHP8创建数组-PHP8知识详解
- 2025-01-07 如何解决PHP中的数组越界问题?
- 2025-01-07 PHP 中数组是如何灵活支持多数据类型的?
- 2025-01-07 PHP数组学习笔记(3)
- 2025-01-07 嘿嘿,你可能不知道PHP如何创建数组
- 2025-01-07 3分钟短文 | PHP 根据值移除数组元素,哪个方法最简单?
- 2025-01-07 PHP如何修改数据库中JSON字段内容
- 2025-01-07 PHP中的数组
- 2025-01-07 PHP二维数组如何据条件提取成一维?
- 2025-01-07 PHP二维数组排序(简单易懂版)
- 最近发表
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)