将数组值分为限定数组和非限定数组

问题描述 投票:0回答:4

我熟悉array_filter,我正在尝试思考更多功能,但我想知道是否有办法保留丢弃的值?例如,如果我有一个像这样的数组:

$arr = array( 1, 2, 3, 4 );
$arrGreaterThanTwo = array_filter($arr, function($item) {
    return $item > 2;
});

结果将是:数组( 3, 4 )。

  1. 有没有办法保留丢弃的值数组(1, 2)?
  2. 或者我是否需要在原始数组上再次重用 array_filter 并返回项目 <= to 2?
  3. 如果我再次使用 array_filter 来抓取 array( 1, 2 ),那么循环原始数组两次不是效率很低吗?

最后,我只是尝试使用 array_filter 循环一次,并将丢弃的值也保留到一个单独的数组中。

php arrays conditional-statements functional-programming filtering
4个回答
6
投票

如果您想获取除过滤后的数组值之外的其他数组值,请使用 array_diff()

array_diff — 计算数组的差异

$arrRemaining = array_diff($arr, $arrGreaterThanTwo);

输出:

Array
(
  [0] => 1
  [1] => 2
)

4
投票
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
一样。


-1
投票

我可能建议您为其编写自己的函数。这是

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
    ]
}

-1
投票

更新回复

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;
} ) );

有人对此有疑问吗?

© www.soinside.com 2019 - 2024. All rights reserved.