我熟悉array_filter,我正在尝试思考更多功能,但我想知道是否有办法保留丢弃的值?例如,如果我有一个像这样的数组:
$arr = array( 1, 2, 3, 4 );
$arrGreaterThanTwo = array_filter($arr, function($item) {
return $item > 2;
});
结果将是:数组( 3, 4 )。
最后,我只是尝试使用 array_filter 循环一次,并将丢弃的值也保留到一个单独的数组中。
如果您想获取除过滤后的数组值之外的其他数组值,请使用 array_diff()
array_diff — 计算数组的差异
$arrRemaining = array_diff($arr, $arrGreaterThanTwo);
输出:
Array
(
[0] => 1
[1] => 2
)
function array_partition(array $array, callable $fn){
$result = [[],[]];
foreach ( $array as $value ){
$result[$fn($value)?0:1][]=$value;
}
return $result;
}
// example usage:
$res = array_partition([1,2,3,4,5,6,7,8,9,10], function($i) { return $i&1==1;});
虽然这不是函数式实现,但它有一个函数式接口,就像
array_filter
一样。
我可能建议您为其编写自己的函数。这是
array_bifilter
– 它不是返回一个数组,而是返回两个数组。第一个是 truthy 值,第二个是 falsey 值。是的,它只迭代输入数组一次。
function array_bifilter(array $xs, callable $f) {
return array_reduce($xs, function ($acc, $x) use ($f) {
if (call_user_func($f, $x))
array_push($acc[0], $x);
else
array_push($acc[1], $x);
return $acc;
}, [[], []]);
}
list($t, $f) = array_bifilter([1,2,3,4], function($x) { return $x > 2; });
echo json_encode(['true' => $t, 'false' => $f], JSON_PRETTY_PRINT), PHP_EOL;
输出(JSON格式,方便阅读)
{
"true": [
3,
4
],
"false": [
1,
2
]
}
更新回复
function test($arrOne, $fn){
$restArr = [];
$filterResults = array_filter($arrOne, function($item) use (&$restArr, $fn) {
if( $fn($item) ) return $item;
$restArr[] = $item;
});
return array( $filterResults, $restArr );
}
print_r( test( array(1,2,3,4), function($item){
return $item > 2;
} ) );
有人对此有疑问吗?