Визначення об'єднання, перетину або різниці двох масивів

завдання
Є два масиви, і потрібно знайти їх об'єднання (всі елементи, але якщо елемент входить в обидва масиви, він враховується один раз), перетин (елементи, що входять в обидва масиву) або різниця (елементи одного масиву, не присутні в іншому).

Рішення
Для визначення об'єднання:
$ Union = array_unique (array_merge ($ a, $ b));

Для обчислення перетину:
$ Intersection = array_intersection ($ a, $ b);

Для знаходження простий різниці:
$ Difference = array_diff ($ a, $ b);

І для отримання симетричної різниці (виключає АБО):
$ Difference = array_merge (array_diff ($ a, $ b), array_diff ($ b, $ a));

Обговорення
Багато з необхідних для таких обчислень компонентів вбудовані в PHP, потрібно тільки об'єднати їх у відповідній послідовності.

При отриманні об'єднання з двох масивів створюється один гігантський масив з усіма значеннями вихідних масивів. Але функція array_merge () дозволяє дублікати значень при об'єднанні двох числових масивів, тому потрібно викликати функцію array_unique (),
щоб відфільтрувати такі елементи.


Але при цьому можуть утворитися пропуски, оскільки функція array_unique () НЕ ущільнює масив. Однак це не представляє труднощі, оскільки і оператор foreach, і функція each () без перешкод обробляють рідко заповнені масиви.

Функція для обчислення перетину має просте ім'я array_intersection () і не вимагає додаткових зусиль.

Функція array_diff () повертає масив, що містить всі унікальні елементи масиву $ old, які не входять в масив $ new. Це називається простий різницею:
$ Old = array ( 'To', 'be', 'or', 'not', 'to', 'be');
$ New = array ( 'To', 'be', 'or', 'whatever');
$ Difference = array_diff ($ old, $ new);
Array
(
[3] => not
[4] => to
)

Результуючий масив $ difference містить 'not' і 'to', так як функція array_diff () чутлива до регістру. У нього не входить елемент whatever ', оскільки його немає в масиві $ old.

Щоб отримати зворотній різницю, або, іншими словами, знайти унікальні елементи масиву $ new, відсутні в масиві $ old, потрібно поміняти місцями аргументи:
$ Old = array ( 'To', 'be', 'or', 'not', 'to', 'be');
$ New = array ( 'To', 'be', 'or', 'whatever');
$ Reverse_diff = array_diff ($ new, $ old);
Array
(
[3] => whatever
)

Масив $ reverse_diff містить тільки елемент whatever '.

Якщо потрібно застосувати функцію або інший фільтр в функції array_diff (), вбудуйте свій власний алгоритм знаходження різниці (віднімання):

// застосуємо нечутливий до регістру алгоритм віднімання; різницю -i
$ Seen = array ();
foreach ($ new as $ n) $ seen [strtolower ($ n)] ++;
>
foreach ($ old as $ o) $ o = strtolower ($ o);
if (! $ seen [$ o]) <$diff[$o] = $o;>
>

Перший оператор foreach створює асоціативний масив для подальшого пошуку.


Потім виконується цикл по масиву $ old і, якщо в процесі пошуку елемент не знайдений, то він додається в масив $ diff.

Цей процес можна прискорити, об'єднавши функції array_diff () і array_map ():

$ Diff = array_diff (array_map ( 'strtolower', $ old),
array_map ( 'strtolower', $ new));

Симетрична різниця - це те, що належить $ a, але не належить $ b, плюс те, що є в $ b, але немає в $ a:

$ Difference = array_merge (array_diff ($ a, $ b), array_diff ($ b, $ a));

Одного разу встановлений, алгоритм рухається вперед. Функція array_diff () викликається двічі і визначає дві різниці. Потім вони об'єднуються в один масив. Немає необхідності викликати функцію array_unique (), так як ці масиви були спеціально сконструйовані як не мають спільних елементів.