面白半分で、ふと思いついたもの。配列に文字列が含まれている限り機能します。
$a = array('a','b','a','c');
$b = array('a');
$counts = array_count_values($b);
$a = array_filter($a, function($o) use (&$counts) {
return empty($counts[$o]) || !$counts[$o]--;
});
各配列を 1 回だけ走査するという利点があります。
実際に見てください。
使い方:
最初に、2 番目の配列の各要素の頻度がカウントされます。これにより、キーが削除される要素であり$a
、値が各要素を削除する回数である配列が得られます。
次に、 の要素を1 つずつarray_filter
調べて、削除する必要がある要素を削除するために使用されます。$a
フィルター関数は、検査中のアイテムと等しいキーがない場合、またはそのアイテムの残りの削除カウントがゼロに達した場合empty
に戻ります。の振る舞いは法案に完全に適合します。true
empty
上記のいずれにも当てはまらない場合はfalse
、削除カウントを返して 1 減らします。Usingfalse || !$counts[$o]--
は簡潔にするためのトリックです: カウントをデクリメントし、false
最初からカウントが 0 より大きいことがわかっているため、常に に評価されます (そうでない場合は、||
を評価した後に短絡しempty
ます)。