Array diff: примеры (PHP)

Сравнение массивов через array_diff в PHP: от основ к сложным случаям
Раздел: Работа с массивами
array_diff(array $array, array ...$arrays): array

Основы функции array_diff

Назначение и применение

Функция array_diff вычисляет расхождение между массивами. Она возвращает элементы первого массива, которые отсутствуют во всех последующих массивах. Функция применяется для сравнения списков данных, фильтрации элементов и поиска уникальных значений.

Синтаксис и аргументы

Синтаксис: array_diff(array $array, array ...$arrays): array

  • $array (обязательный): Исходный массив для сравнения.
  • ...$arrays (обязательный): Один или несколько массивов для сравнения с исходным.

Функция сравнивает данные, используя приведение типов, где строка '1' и число 1 считаются равными. Для проверки на идентичность с учетом типов существует функция array_diff_assoc.

Базовые примеры использования

Сравнение двух массивов
$array1 = ["a", "b", "c", "d"];
$array2 = ["b", "d", "e"];
$result = array_diff($array1, $array2);
print_r($result);
Array
(
    [0] => a
    [2] => c
)
Сравнение с несколькими массивами
$array1 = [1, 2, 3, 4, 5];
$array2 = [2, 4];
$array3 = [3, 5];
$result = array_diff($array1, $array2, $array3);
print_r($result);
Array
(
    [0] => 1
)
Сравнение с разными типами данных
$array1 = [1, "1", true, null, "test"];
$array2 = [true, "1"];
$result = array_diff($array1, $array2);
print_r($result);
Array
(
    [0] => 1
    [3] =>
    [4] => test
)

Похожие функции в PHP

Сравнивает массивы с проверкой ключей и значений. Возвращает элементы из первого массива, которых нет в других, сравнивая и ключи, и значения.

array_udiff

Вычисляет расхождение массивов, используя callback-функцию для сравнения. Позволяет задать собственную логику сравнения элементов.

Сравнивает массивы по ключам. Возвращает элементы первого массива, чьи ключи отсутствуют в других массивах.

Выбор функции

Для простого сравнения значений используют array_diff. При необходимости сравнения с учетом ключей применяют array_diff_assoc. Для нестандартной логики сравнения выбирают array_udiff.

Распространенные ошибки

Изменение ключей массива

Функция сохраняет ключи исходного массива, что может привести к неожиданным результатам при последующем переборе:

$array1 = [10 => 'a', 20 => 'b', 30 => 'c'];
$array2 = ['b'];
$result = array_diff($array1, $array2);
print_r($result);
Array
(
    [10] => a
    [30] => c
)
Приведение типов

Сравнение с приведением типов может давать неожиданные результаты:

$array1 = [0, '0', false, null, ''];
$array2 = [false];
$result = array_diff($array1, $array2);
print_r($result);
Array
(
    [4] =>
)
Пустой результат

Когда все элементы первого массива присутствуют в других, функция возвращает пустой массив, что иногда ошибочно интерпретируют как false:

$array1 = [1, 2];
$array2 = [1, 2, 3];
$result = array_diff($array1, $array2);
var_dump($result);
if (empty($result)) {
    echo "Массив пуст, но это не false";
}
array(0) {
}
Массив пуст, но это не false

Изменения в последних версиях PHP

PHP 8.0

В PHP 8.0 были внесены значительные изменения в обработку неверных параметров. Раньше функция могла молчаливо пропускать недопустимые аргументы, теперь же она выбрасывает исключение TypeError.

Пример изменения поведения
// В PHP 7.x:
$result = array_diff([1, 2], null); // Возвращал [1, 2]

// В PHP 8.0+:
$result = array_diff([1, 2], null); // TypeError
PHP 8.1 и выше

Версии PHP 8.1+ не вносили существенных изменений в работу array_diff, но улучшили общую производительность и стабильность функций для работы с массивами.

Расширенные примеры

Сравнение многомерных массивов

Для сравнения многомерных массивов можно использовать array_udiff с пользовательской функцией сравнения:

Пример php
$array1 = [
    ['id' => 1, 'name' => 'John'],
    ['id' => 2, 'name' => 'Jane'],
    ['id' => 3, 'name' => 'Bob']
];

$array2 = [
    ['id' => 2, 'name' => 'Jane'],
    ['id' => 4, 'name' => 'Alice']
];

$result = array_udiff($array1, $array2, function($a, $b) {
    return $a['id'] <=> $b['id'];
});

print_r($result);
Array
(
    [0] => Array
        (
            [id] => 1
            [name] => John
        )

    [2] => Array
        (
            [id] => 3
            [name] => Bob
        )

)
Фильтрация дубликатов из нескольких массивов
Пример php
$main = ['apple', 'banana', 'cherry', 'date'];
$exclude1 = ['banana', 'date'];
$exclude2 = ['cherry'];
$exclude3 = ['apple', 'fig'];

$unique = array_diff($main, $exclude1, $exclude2, $exclude3);
print_r($unique);
Array
(
)
Работа с большими наборами данных

При работе с большими массивами можно оптимизировать производительность, используя array_flip для поиска по ключам:

Пример php
$largeArray1 = range(1, 100000);
$largeArray2 = range(50000, 150000);

// Оптимизированный вариант через array_keys и array_flip
$flipped = array_flip($largeArray2);
$result = [];

foreach ($largeArray1 as $value) {
    if (!isset($flipped[$value])) {
        $result[] = $value;
    }
}

// Сравнение с обычным array_diff
// $result2 = array_diff($largeArray1, $largeArray2);

echo "Найдено элементов: " . count($result);
Найдено элементов: 49999
Сравнение с частичным совпадением строк

Для поиска частичных совпадений можно комбинировать array_diff с array_filter:

Пример php
$array1 = ["apple pie", "banana split", "cherry cake"];
$array2 = ["pie", "cake"];

$result = array_filter($array1, function($item) use ($array2) {
    foreach ($array2 as $search) {
        if (strpos($item, $search) !== false) {
            return false;
        }
    }
    return true;
});

print_r($result);
Array
(
    [1] => banana split
)

Аналоги в других языках

Python

Используют множества (sets) или list comprehension:

list1 = [1, 2, 3, 4]
list2 = [3, 4, 5]
result = [x for x in list1 if x not in list2]
print(result)

# Или через множества (уникальные элементы):
result_set = set(list1) - set(list2)
print(list(result_set))
[1, 2]
[1, 2]

Array diff в Javascript

Используют методы filter и includes или Set:

const array1 = [1, 2, 3, 4];
const array2 = [3, 4, 5];
const result = array1.filter(x => !array2.includes(x));
console.log(result);

// Через Set (для уникальных элементов):
const set2 = new Set(array2);
const resultSet = array1.filter(x => !set2.has(x));
console.log(resultSet);
[1, 2]
[1, 2]

Array diff в MySQL

Для сравнения наборов данных используют конструкции NOT IN или LEFT JOIN:

-- Пример с NOT IN
SELECT id FROM table1
WHERE id NOT IN (SELECT id FROM table2);

PHP array_diff function comments

En
Array diff Computes the difference of arrays