PHP 关联数组操作太麻烦,试试这几个 WPJAM Basic 内置的数组处理函数

PHP 有很多非常好用的数组处理函数,PHP 数组函数官方文档都有 80 多个,但是在使用过程,有一些数组的操作使用比较多,我就把这些函数整理成工具函数,然后整合到 WPJAM Basic 中,方便自己的二次开放时候使用,现在整理放出来,如果你和我一样基于 WPJAM Basic 进行二次开发,也可以使用:

文章目录[隐藏]

  • wpjam_array_excerpt
  • wpjam_array_filter
  • wpjam_array_first
  • wpjam_array_merge
  • wpjam_array_pull
  • wpjam_array_push

wpjam_array_excerpt

PHP 从关联数组中移除指定的键值对,一般使用 unset 函数,比如:

$array	= ['name' => 'Desk', 'description'=>'long description' 'price' => 100];
unset($array['price']);
unset($array['description']);
print_r($array);	// ['name' => 'Desk']

如果要移除多个键值对,就要调用多次的 unset 函数,所以就合并成一个函数 :

function wpjam_array_except($array, $keys){
if(is_string($keys)){
$keys	= [$keys];
}
foreach($keys as $key){
unset($array[$key]);
}
return $array;
}

这样就可以通过下面方式移除键值对了:

$array = wpjam_array_except($array, ['price','description']);

如果仅仅移除一个键值对,还可以直接传递字符串:

$array = wpjam_array_except($array, 'price'); 

wpjam_array_filter

我们使用 array_filter 对数组进行过滤的时候,是不会递归调用的,意思如果其中元素也是数组的时候,是不会进行同样的过滤的操作。

$array	= ['a'=>'a', 'b'=>null, 'c'=>['c1'=>'c1', 'c2'=>null, 'c3'=>'c3']];
var_dump(array_filter($array, 'is_exists'));

输出结果为:

array(2) {
["a"] => string(1) "a"
["c"] => array(3) {
["c1"] => string(2) "c1"
["c2"] => NULL
["c3"] => string(2) "c3"
}
}

但是我们在一些数据处理的时候,比如后台字段提交的时候,我们希望过滤掉 null 的值,如果元素也是一个关联数组的时候,我们希望关联数组元素中的 null 的值也会过滤掉。所以我们就写了 wpjam_array_filter 这个函数,实现 array_filter 递归调用:

function wpjam_array_filter($array, $callback, $mode=0){
foreach($array as $key=>&$value){
if(is_array($value)){
$value	= wpjam_array_filter($value, $callback, $mode);
}
}
return array_filter($array, $callback, $mode);
}

同样的数组:

$array	= ['a'=>'a', 'b'=>null, 'c'=>['c1'=>'c1', 'c2'=>null, 'c3'=>'c3']];
var_dump(wpjam_array_filter($array, 'is_exists'));

输出结果为:

array(2) {
["a"] => string(1) "a"
["c"] => array(2) {
["c1"] => string(2) "c1"
["c3"] => string(2) "c3"
}
}

wpjam_array_first

PHP 的 array_filter() 函数让我们可以通过回调函数来过滤数组,但是返回的是过滤后的数组,但是很多时候,我们只是简单的要求返回过滤之后数组的第一个元素

function wpjam_array_first($array, $callback=null){
if(!is_array($array)){
return null;
}
if($callback && is_callable($callback)){
foreach($array as $key => $value){
if(call_user_func($callback, $value, $key)){
return $value;
}
}
}else{
return current($array);
}
}

使用非常简单的:

$array	= [100, 200, 300];
$value	= wpjam_array_first($array, function($value) {
return $value >= 150;
});
// 200

wpjam_array_merge

如果我们要合并的数组是多维的关联数组,那么使用array_merge_recursive()函数进行合并的话,不会进行键名覆盖,而是将多个相同键名的值递归合并成一个数组。

$ar1 = array("color" => array("red", "green"), "aa");
$ar2 = array("color" => array( "green", "blue"), "bb");
$result = array_merge_recursive($ar1, $ar2);
print_r($result);

输出结果:

[
'color' => [
(int) 0 => 'red',
(int) 1 => 'green',
(int) 2 => 'green',
(int) 3 => 'blue'
],
(int) 0 => 'aa',
(int) 1 => 'bb'
]

其实我们希望子数组里面的相同的值覆盖,据此我们写了一个函数,用来深度合并多维数组:

function wpjam_array_merge($arr1, $arr2){
foreach($arr2 as $key => $value){
if((is_array($value) && !wp_is_numeric_array($value))
&& (isset($arr1[$key]) && is_array($arr1[$key]) && !wp_is_numeric_array($arr1[$key]))
){
$arr1[$key]	= wpjam_array_merge($arr1[$key], $value);
}else{
$arr1[$key]	= $value;
}
}
return $arr1;
}

相同的数组进行合并:

$ar1 = array("color" => array("red", "green"), "aa");
$ar2 = array("color" => array( "green", "blue"), "bb");
$result = wpjam_array_merge($ar1, $ar2);
print_r($result);

得到的结果是:

[
'color' => [
(int) 0 => 'green',
(int) 1 => 'blue'
],
(int) 0 => 'bb'
]

一般不推荐使用 wpjam_array_merge 对多维索引数组进行合并。

wpjam_array_pull

要从关联数组中移除并返回指定的键值,一般需要两步操作,先取出,然后 unset 数组中的键值对:

$array	= ['name' => 'Desk', 'price' => 100];
$value	= $array['name'];
unset($array['name']);

如果每次都这么操作,有点烦人,所以就把这两个步骤合成一个函数,并且还可以设置数组中无此键对应的元素的时候的默认值。

function wpjam_array_pull(&$array, $key, $default=null){
if(isset($array[$key])){
$value	= $array[$key];
unset($array[$key]);
return $value;
}else{
return $default;
}
}

然后直接调用即可:

$name	= wpjam_array_pull($array, 'name');

wpjam_array_push

PHP 关联数组可以通过三种方式插入新元素:

$array[$insert_key] = $insert_value;			// 插在最后
$array	= array_merge($array, $insert_array);	// 合并到最后
$array	= $array+$insert_array;					// 插在最前面

由此可见,关联数组插入元素是无法指定位置的,只能插在最前或者最后面,所以这个函数就是实现向关联数组插入元素时候指定的 Key 之前

function wpjam_array_push(&$array, $data, $key=null){
if(!is_array($array) || !is_array($data) || wp_is_numeric_array($data)){
return;
}
if(is_null($key)){
$offset	= false;
}else{
$offset	= array_search($key, array_keys($array), true);
}
if($offset !== false){
$array	= array_merge(array_slice($array, 0, $offset), $data, array_slice($array, $offset));
}else{
$array	= array_merge($array, $data);
}
}

比如下面在 $columns'author' 之前插入 ['page_title'=>'页面标题']

wpjam_array_push($columns, ['page_title'=>'页面标题'], 'author');
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容