PHP与array_filter相反?

时间:2016-09-23 12:07:01

标签: php arrays functional-programming

我熟悉array_filter,我试图想更多功能,但我想知道是否有办法保留丢弃的值?例如,如果我有一个像:

这样的数组
ps aux | grep java

结果将是:array(3,4)。

  1. 有没有办法保留丢弃的值数组(1,2)?
  2. 或者我是否需要在原始数组上重复使用array_filter并返回项目< = to 2?
  3. 如果我再次使用array_filter来获取数组(1,2),那么通过在原始数组上循环两次会不会有效率呢?
  4. 最后,我只想尝试使用array_filter循环一次,并将丢弃的值保留在一个单独的数组中。

    提前致谢!

4 个答案:

答案 0 :(得分:4)

如果您希望将其他数组值与已过滤的数组值区分开来,请使用array_diff()

  

array_diff - 计算数组的差异

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

输出:

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

答案 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类似的功能界面。

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

有没有人有这个问题?

答案 3 :(得分:-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
    ]
}