2016-09-23 4 views
1

私はarray_filterに精通しており、もっと機能的だと思っていますが、破棄された値を保持する方法があるのだろうかと思っていました。たとえば、次のような配列があるとします。PHPは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に戻す必要がありますか?
  2. array_filterを再度使用して配列(1,2)を取得すると、元の配列を2回ループすることで効率が悪くなりませんか?

最後に、私はarray_filterを使用して1回ループし、破棄された値も別の配列に保存しようとしています。

ありがとうございます!

+3

ちょうどその時あなたは1つのアレイと、残りにあなたの条件を満たす要素を追加することができますのif/else条件を持つ単純なforeachループを使用します別の – Rizier123

+1

配列をフィルタリングします。それは、それが何をしているのかということである。 foreachループを使用するだけです。 – PeeHaa

+0

2回ループすることは非効率的ではありません。それを試してみてください。テスト実行時間。 – Andrew

答えて

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のような機能的なインターフェイスを備えています。

+0

興味深い...まったく新しい思考プロセス...ちょうど私の心を吹き飛ばした。数回それを読んでいた。 – FNMT8L9IN82

+0

Wups、私は鉱山を提出する前にあなたの回答を読んでいませんでした。 A + work、Sylwester^_^ – naomik

+0

@naomikありがとう。私はPHPがこれを持っていなかったことに驚きました。 – Sylwester

3

あなたは array_diff array_diff()

を使用し、フィルターのものから離れて、他の配列の値を取得したい場合は -

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

配列の差を計算する出力:

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

私はこの回答がシンプルで、きれいで、わかりやすいので好きです。しかし、私が間違っていれば私を修正してください...これは2回繰り返されています。私は自分の疑問にぶつかり、他の開発者が何を考えているかを見ていきます。ご回答どうもありがとうございました。 – FNMT8L9IN82

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

誰もがこのに問題がありますか?

+1

はい、問題は '$ restArr'のグローバルスコープです。副作用は一般的にコードをデバッグするのが困難であるため、グローバル変数は使用しない方がよい。アイデアは良いですが、Sylwesterの提案ははるかにクリーンです。 – Keelan

+0

お返事ありがとうございます。それは理にかなっている。 – FNMT8L9IN82

+0

@CamilStapsどうすれば独自のメソッドや関数でこれを囲み、両方の配列を返すのですか? $ restArrはグローバルであっても、メソッド内の "グローバル"のみです。 – FNMT8L9IN82

-1

独自の関数を作成することをおすすめします。これはarray_bifilterです - 1つの配列を返す代わりに、2つを返します。最初はtruthyの値で、2番目の値はfalseyの値です。そして、はい、入力配列を1回だけ繰り返します。

​​

(読みやすいJSON形式で)出力

{ 
    "true": [ 
     3, 
     4 
    ], 
    "false": [ 
     1, 
     2 
    ] 
} 
関連する問題