还没升级到 PHP 8.4,也可以提前在 WordPress 中使用 PHP 8.4 引入的数组函数
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 到最新版就能使用了,所以记得更新,有什么问题,记得给我留言。