php提取数组某列并可以某列作为索引的array_column、指定函数过滤以及过滤空值array_filter以及数组处理函数array_map和array_walk/array_walk...

一、php好用的数组函数[提取数组某列并可以某列作为索引array_column]和[指定函数过滤以及过滤空值array_filter]

    在写代码时会经常需要对数组进行各种处理,php中的数组函数也是非常丰富,这些数组函数也并非必须要用,但使用它们一可以让代码更简洁,二也让写代码的我们显得更专业。所以最好对PHP中各数组函数功能有一些了解,这样的话在需要的时候,只要有一点印象也可以立即通过查文档而找到函数,不然很可能就自己for循环搞一下完事了。

今天我再整理一下比较有用的数组函数array_column,同时也是让自己加深一下印象:

1. array_column:

        返回输入数组中某个单一列的值,另外还可以指定索引列。

    对一维数组的关联数组,我们也可以使用array_keys取得包含所有键名的数组。对一维索引数组,我们通常可以通过array_values来取得包含所有值的数组;而对于二维数组,array_values只能实现去除关联键名的作用,没法对值再进行细处理,这时就可以好好利用array_column了。通常的应用情景是:一个从MYSQL数据库里刚取出来的一个多维数组,有时我们只需要其中的一列值,这时就可以使用array_column(Array, field); 来提取这列数据的数组,而且array_column还可以指定第三个参数,可将第三个参数所索引的列值作为关联数组键名返回,增加了很多便利。减少不必要的一堆循环处理语句。如下:

#$data为从数据库里取出的数据,格式如下。
-----------------------( 1 )-----------------------------
Array
(
    [0] => Array
        (
            [movieid] => 845535
            [videoid] => 3265938
            [create_time] => 2019-01-11 10:03:38
        )

    [1] => Array
        (
            [movieid] => 845506
            [videoid] => 3267285
            [create_time] => 2019-01-11 10:03:36
        )

    [2] => Array
        (
            [movieid] => 845502
            [videoid] => 3265979
            [create_time] => 2019-01-11 10:03:34
        )

)
#使用array_column提取videoid这列数据作为值,得到的数组打印如下
$rs = array_column($data, 'videoid'); 
-----------------------( 2 )-----------------------------
Array
(
    [0] => 3265938
    [1] => 3267285
    [2] => 3265979
)
#array_column指定第三个参数,即可将第三个参数所索引的列值作为关联数组键名返回
$rsa = array_column($data, 'videoid', 'create_time'); 
-----------------------( 3 )-----------------------------
Array
(
    [2019-01-11 10:03:38] => 3265938
    [2019-01-11 10:03:36] => 3267285
    [2019-01-11 10:03:34] => 3265979
)

2. array_filter :

        用回调函数过滤数组中的单元,不提供callback函数,默认将删除数组中所有等值为 FALSE 的数据(过滤空值)

    array_filter与array_walk、array_map等不同,array_filter不会改变数组键值,只是通过回调函数返回的结果来确定是否过滤该值,回调函数返回true,则此对键值就会保留而不过滤。如下使用array_filter过滤张姓人名,以及不传回调函数,可以过滤空字符串,0,null,false这些等值为false的数据项:

#过滤张姓人名
function zhang($var)
{
    return mb_substr($var, 0, 1)=='张';
}
$array = array("a"=>'张三丰', "b"=>'张无忌', "c"=>'灭绝师太');
print_r(array_filter($array, "zhang"));

#过滤空字符串,0,null,false
$array = array("a"=>'', "b"=>0, "c"=>'0',"d"=>null,"e"=>' ',"f"=>false,'g'=>"False");
print_r(array_filter($array));

#以上两项输出结果如下:
Array ( [a] => 张三丰 [b] => 张无忌 ) 
Array ( [e] => [g] => False )

二、数组处理函数array_map和array_walk以及array_walk_recursive的示例详解和区别

    array_map,array_walk,array_walk_recursive三个函数,array_walk_recursive比较明显,可以认为是array_walk函数的升级版,它会递归地处理数组中的元素,先放一边。对比一下array_map和array_walk,从功能上看array_map和array_walk都是使用回调函数对数组单元进行处理,array_map详解如下:

1. array_map

将回调函数作用到给定数组的单元上
使用格式:array array_map ( callable $callback , array $arr1 [, array $... ] )
array_map() 返回一个数组,该数组包含了 arr1 中的所有单元经过 callback 作用过之后的单元。callback接受的参数数目应该和传递给 array_map() 函数的数组数目一致。

#取得一个data数组,键值显示如下:
$json = '{"226495":"2018-12-25 10:47:47","226519":"2018-12-25 10:47:45","226499":"2018-12-25 10:47:44","226604":"2019-01-11 11:21:51","226517":"2018-12-25 10:47:36","226630":"2019-01-11 11:17:56","226493":"2018-12-25 10:47:34","226502":"2018-12-25 10:47:32"}';
$data = json_decode($json, true);
print_r($data);
$dates = array_values($data);

#自定义函数只传递一个参数,
function test1($val){    return explode(' ', $val)[1]; }
function test2($val, $val2){    return current(explode(' ', $val)); }
function test3($val, $val2){   return explode(' ', $val)[1].'=='.$val2; }
#调用array_map对单个数组值进行处理,索引能保持
print_r(array_map('test1', $data));
#传递多个数组后返回的数组键名重新进行数字索引
print_r(array_map('test2', $data, $dates));
#传递多个数组进行数据重组处理
print_r(array_map('test3', $data, $dates));

#页面显示如下:
Array
(
    [226495] => 2018-12-25 10:47:47
    [226519] => 2018-12-25 10:47:45
    [226499] => 2018-12-25 10:47:44
    [226604] => 2019-01-11 11:21:51
    [226517] => 2018-12-25 10:47:36
    [226630] => 2019-01-11 11:17:56
    [226493] => 2018-12-25 10:47:34
    [226502] => 2018-12-25 10:47:32
)
Array
(
    [226495] => 10:47:47
    [226519] => 10:47:45
    [226499] => 10:47:44
    [226604] => 11:21:51
    [226517] => 10:47:36
    [226630] => 11:17:56
    [226493] => 10:47:34
    [226502] => 10:47:32
)
Array
(
    [0] => 2018-12-25
    [1] => 2018-12-25
    [2] => 2018-12-25
    [3] => 2019-01-11
    [4] => 2018-12-25
    [5] => 2019-01-11
    [6] => 2018-12-25
    [7] => 2018-12-25
)
Array
(
    [0] => 10:47:47==2018-12-25 10:47:47
    [1] => 10:47:45==2018-12-25 10:47:45
    [2] => 10:47:44==2018-12-25 10:47:44
    [3] => 11:21:51==2019-01-11 11:21:51
    [4] => 10:47:36==2018-12-25 10:47:36
    [5] => 11:17:56==2019-01-11 11:17:56
    [6] => 10:47:34==2018-12-25 10:47:34
    [7] => 10:47:32==2018-12-25 10:47:32
)

     使用过程中发现:

2. array_map有如下特点:

A,array_map在调用的方法中取不到数组的键名,特别是只传递一个数组的时候,它完全是处理值。
B,只传递一个数组给array_map最后得到的数组键名不变,但是如果传递多个数组则键名全都自动变成重新排列的数字索引。
C,回调函数是平行作用于相应的单元上的, 所以使用多个数组时,它们的长度应该相同。不然则最短的一个将被用空的单元扩充。

        总结:array_map的主要作用是通过自定义函数对数组的值进行另外处理,另外可以做为对多个数组的相对应单元进行数据合并处理等。

        另外,看到array_map函数一个很有趣的用法,也许我们在开发的时候有时也遇到过,但是不知道这个能实现,或许走了些弯路。array_map可以很容易的通过用NULL作为回调函数名来构造一个数组的数组。如下array_map实现三个维度的数据的合并代码:

#三个维度的数据合并
$names = array('zhangsan', 'lisi', 'wangwu');
$sex = array("man", "sex", "man");
$age = array(20, 25, 28);
$users = array_map(null, $names, $sex, $age);
print_r($users);

#输出结果如下:
Array
(
    [0] => Array
        (
            [0] => zhangsan
            [1] => 20
            [2] => man
        )

    [1] => Array
        (
            [0] => lisi
            [1] => 25
            [2] => sex
        )

    [2] => Array
        (
            [0] => wangwu
            [1] => 28
            [2] => man
        )
)

3. array_walk 

使用用户自定义函数对数组中的每个元素做回调处理
使用格式:bool array_walk ( array &$array , callable $funcname [, mixed $userdata = NULL ] )
array_walk() 将用户自定义函数 funcname 应用到 array 数组中的每个单元。 成功时返回 TRUE, 或者在失败时返回 FALSE。

4. array_walk()使用示例如下:

#不修改原数组,直接显示
function walk1($value, $key){   echo '第',$key,'名:',$value,'<br>';}

#地址引用,直接修改
function walk2(&$value, $key){    $value = '第'.$key.'名:'.$value;}

#地址引用,直接修改, 附带其它数据
function walk3(&$value, $key, $more){    $value =  $more .$value;}

$names = array(1=>'zhangsan',2=> 'lisi',3=> 'wangwu');
$result = array_walk($names, 'walk1');
var_dump($result);
echo '------------------<br>';

$result2 = array_walk($names, 'walk2');
print_r($names);
var_dump($result2);
echo '------------------<br>';

$result3 = array_walk($names, 'walk3', '大家好, ');
print_r($names);
var_dump($result3);

#页面显示结果:
第1名:zhangsan
第2名:lisi
第3名:wangwu
bool(true)
------------------
Array
(
    [1] => 第1名:zhangsan
    [2] => 第2名:lisi
    [3] => 第3名:wangwu
)
bool(true)
------------------
Array
(
    [1] => 大家好, 第1名:zhangsan
    [2] => 大家好, 第2名:lisi
    [3] => 大家好, 第3名:wangwu
)
bool(true)

使用中发现:

5. array_walk有如下特点:

1, array_walk同时能拿到数据的键和值
2,array_walk并不返回新数组,只返回标识操作是否成功的布尔值
3,因为array_walk不返回数组,array_walk的使用更倾向于在原数组上进行数据修改处理,当然也可以在另外一个变量上处理。

6. 总结

    通过上面对array_map和array_walk的使用,综合起来对比区别如下:

A,array_walk主要是针对单个数组进行处理,array_map可以处理单个,也可以把多个数组结合一起处理。
B,array_map的作用更多的是得到一个新数组,array_walk更多的是想做一些job, 只要结果执行成功了即行。
C,对单个数组进行操作时,array_map和array_walk功能很像,区别在于array_map是取得返回的数组;而array_walk因为不返回所以通过地址引用在原数组上修改以实现“返回”。
D,对多个数组处理时array_map比array_walk更适合。

最后关于:array_walk_recursive

array_walk_recursive 对数组中的每个成员递归地应用用户函数

bool array_walk_recursive ( array &$input , callable $funcname [, mixed $userdata = NULL ] )

    将用户自定义函数 funcname 应用到 array 数组中的每个单元。与array_walk不同的是,array_walk_recursive函数会递归到更深层的数组中去,即对多维数组,array_walk_recursive会深入到更深层的数组键值中去处理。有一点需要要特别注意的是传入给array_walk_recursive的数组参数中任何值为 array 的键都不会被传递到回调函数中去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林戈的IT生涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值