JavaScript过滤数组过滤方法filter详解,并比PHP中的array_filter作一下比较

作者:佚名     字体:[增加 减小]    类型:转载
JavaScript中的Array.prototype.filter()方法在遍历数组时可以极大地简化循环体内的代码,如何使用,本文为您娓娓道来。另外,作为一个资深的PHP程序员,本文还为你讲解了与JS中的filter方法极为相似的PHP函数array_filter,并教你如何在ThinkPHP控制器里如何使用。

JavaScript中,Array.prototype.filter()方法返回的数组元素是调用的数组的一个子集。传递的函数是用来逻辑判定的:该函数返回true或false。调用判定函数就像调用forEach()和map()一样(请参考《Javascript中Array.prototype.map()详解》)。如果返回值为true或能转化为true的值,那么传递给判定函数的元素就是这个子集的成员,它将被添加到一个作为返回值的数组中。例如:

<script>
var a = [6, 7, 8, 9, 10, 11, 12];
var b = a.filter(function(e){   //不像PHP的array_filter,必须传参
    return e%2===1;
});
console.log(b); //=> [7, 9, 11]
</script>

注意,filter()会跳过稀疏数组中缺少的元素,它的返回数组总是稠密的。为了压缩稀疏数组的空缺,代码如下:

var dense = sparse.filter(function(){return true;});

压缩空缺并删除undefined和null元素,可以这样使用

a = a.filter(function(e){return e!==null && e!==undefined ;});

我们把JS中的filter()方法讲解完了,学过PHP的朋友,肯定会想到与它非常相似的一个函数array_filter(),二者的功能相似。在php5.3版本以前,因为在PHP的类里使用array_filter,还得 array_filter(array($this,'callback_func'),$array),因为还要再开销一个函数,所以使用并不是很多,但是在PHP5.3之后,PHP中函数传参可以像JS一样传函数,这样的话,使用array_filter()就异常方便了,大家请看下面的例子

/*
    有一组数字列表,我们想输出其中可以被3整除的数
*/
$a = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
var_export(array_filter($a,function($e){
    return $e%3 === 0;          
}));    //=> array ( 2 => 3, 5 => 6, 8 => 9, 11 => 12, 14 => 15, )

下面截出的代码,是在ThinkPHP3.1.2版本中的控制器中演示的使用array_filter()函数的使用方法。

在ThinkPHP中的控制器中如何使用array_filter函数

array_filter()函数的语法结构如下

array array_filter ( array $input [, callback $callback ] )

说明:array_filter() 依次将 input 数组中的每个值传递到 callback 函数。如果 callback 函数返回 TRUE,则 input 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。

另外需要注意的是,array_filter()可以不传入函数callback

<?php

$entry = array(
             0 => 'foo',
             1 => false,
             2 => -1,
             3 => null,
             4 => ''
          );

print_r(array_filter($entry));
?>