Chỉ cần cho những niềm vui của nó, cái gì mà chỉ lóe lên trong óc. Sẽ hoạt động miễn là các mảng của bạn chứa các chuỗi:
$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]--;
});
Nó có lợi thế là nó chỉ đi qua từng mảng của bạn một lần.
See it in action.
Cách hoạt động:
Đầu tiên các tần số của mỗi phần tử trong mảng thứ hai được tính. Điều này cho chúng ta một mảng trong đó các khóa là các phần tử cần được loại bỏ khỏi $a
và các giá trị là số lần mà mỗi phần tử cần được loại bỏ.
Sau đó, array_filter
được sử dụng để kiểm tra các thành phần của $a
từng cái một và xóa những phần tử cần xóa. Chức năng lọc sử dụng empty
để trả lại true
nếu không có khóa nào bằng với mục đang được kiểm tra hoặc nếu số lần xóa còn lại cho mục đó đã đạt đến 0; Hành vi của empty
phù hợp với hóa đơn một cách hoàn hảo.
Nếu cả hai trường hợp trên không giữ được thì chúng tôi muốn trả lại false
và giảm số lần xóa theo một. Sử dụng false || !$counts[$o]--
là một thủ thuật để có thể hiểu được: nó giảm số lượng và luôn đánh giá là false
vì chúng ta biết rằng số đếm lớn hơn 0 để bắt đầu (nếu không, ||
sẽ đoản mạch sau khi đánh giá empty
).
array_unique() trả về mảng không có giá trị trùng lặp. Những gì tôi đang cố gắng làm là trừ hai mảng. array_diff() thực hiện điều này nhưng nó không chính xác. – STEELHE4RT