tylko dla zabawy, coś, co tylko przyszło mi do głowy. Będzie działać tak długo, jak tablice zawierają ciągi:
$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]--;
});
Ma tę zaletę, że idzie tylko na każdej z tablic tylko raz.
See it in action.
Jak to działa:
Najpierw częstotliwości każdego elementu w drugiej tablicy są liczone. To daje nam tablice, w których klucze są elementami, które powinny zostać usunięte z $a
, a wartości to liczba przypadków, w których każdy element powinien zostać usunięty.
Następnie jeden array_filter
służy do badania elementów $a
i usuwania tych, które powinny zostać usunięte. Funkcja filtru używa empty
do zwracania true
, jeśli nie ma klucza równego badanemu elementowi lub jeśli pozostała liczba usunięć dla tego przedmiotu osiągnęła zero; Zachowanie się pasuje idealnie do rachunku.
Jeśli żadne z powyższych nie zostanie spełnione, chcemy zwrócić false
i zmniejszyć liczbę usunięć o jeden. Używanie false || !$counts[$o]--
jest sztuczką, aby być zwięzłym: zmniejsza ona liczbę i zawsze ocenia się na false
, ponieważ wiemy, że liczba była na początku większa niż zero (gdyby nie było, ||
spowodowałoby zwarcie po ocenie empty
).
array_unique() zwraca tablicę bez zduplikowanych wartości. Próbuję odjąć dwie tablice. array_diff() robi to, ale nie jest dokładne. – STEELHE4RT