簡體   English   中英

PHP的array_filter對面?

[英]PHP opposite of array_filter?

我對array_filter很熟悉,並且我想嘗試更多的功能,但是我想知道是否有辦法保留丟棄的值? 例如,如果我有一個類似的數組:

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

結果將是:array(3,4)。

  1. 有沒有辦法保留丟棄的值array(1,2)?
  2. 還是我需要再次在原始數組上重用array_filter並將項<=返回2?
  3. 如果我再次使用array_filter來抓取array(1,2),那么通過遍歷原始數組兩次就不會效率低下嗎?

最后,我只想使用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一樣的功能接口。

更新的回應

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

有人對此有疑問嗎?

我可能建議您為此編寫自己的函數。 這是array_bifilter –而不是返回一個數組,而是返回兩個。 第一個是真實值,第二個是虛假值。 是的,它只遍歷輸入數組一次。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM