IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    还没升级到 PHP 8.4,也可以提前在 WordPress 中使用 PHP 8.4 引入的数组函数

    Denis | 邓鸿华发表于 2024-12-02 15:17:47
    love 0

    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 到最新版就能使用了,所以记得更新,有什么问题,记得给我留言。

    © WordPress果酱 / RSS 订阅 / 长期承接 WordPress 项目



沪ICP备19023445号-2号
友情链接