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 分享
It doesn't matter how slow you are, as long as you're determined to get there, you'll get there.
不管你有多慢,都不要紧,只要你有决心,你最终都会到达想去的地方
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容