Array intersect: примеры (PHP)
array_intersect(array $array, array ...$arrays): arrayФункция array_intersect() вычисляет пересечение массивов. Она возвращает массив, содержащий все значения массива array, которые существуют во всех остальных переданных массивах. Ключи сохраняются.
Используется для нахождения общих элементов среди нескольких массивов. Полезно при сравнении списков, фильтрации данных по условию принадлежности к другому набору.
Функция принимает переменное количество аргументов:
array $array- основной массив, с которым происходит сравнение.array ...$arrays- массив или массивы для сравнения значений с первым массивом.
Сравнение значений происходит по типу свободное (==). Для строгого сравнения (===) существует функция array_intersect_assoc() или array_uintersect() с пользовательской callback-функцией.
Примеры использования
Нахождение общих чисел в двух массивах.
<?php
$array1 = [1, 2, 3, 4];
$array2 = [3, 4, 5, 6];
$result = array_intersect($array1, $array2);
print_r($result);
?>Array
(
[2] => 3
[3] => 4
)<?php
$a1 = ["a", "b", "c", "d"];
$a2 = ["b", "c", "e"];
$a3 = ["c", "d", "f"];
$res = array_intersect($a1, $a2, $a3);
print_r($res);
?>Array
(
[2] => c
)Ключи из первого массива сохраняются в результате.
<?php
$arr1 = ['one' => 'apple', 'two' => 'banana', 'three' => 'cherry'];
$arr2 = ['banana', 'apple', 'grape'];
$res = array_intersect($arr1, $arr2);
print_r($res);
?>Array
(
[one] => apple
[two] => banana
)Похожие функции в PHP
- array_intersect_assoc() - вычисляет пересечение массивов с дополнительной проверкой индекса. Сравнивает и ключи, и значения.
- array_intersect_key() - вычисляет пересечение массивов, сравнивая ключи. Возвращает элементы первого массива, ключи которых есть во всех остальных массивах.
- array_uintersect() - вычисляет пересечение массивов, используя для сравнения значений callback-функцию. Позволяет задать свою логику сравнения.
- array_intersect_uassoc() - вычисляет пересечение массивов с дополнительной проверкой индекса через callback-функцию.
- array_intersect_ukey() - вычисляет пересечение массивов, используя callback-функцию для сравнения ключей.
array_intersect() применяется, когда важны только значения. Если важны пары ключ-значение, нужна array_intersect_assoc(). Для сравнения по ключам - array_intersect_key(). При необходимости нестандартного сравнения используют варианты с callback-функциями.
Типичные ошибки
При свободном сравнении строки, содержащие число, и целые числа могут считаться равными.
<?php
$arr1 = ["1", "2", "3"];
$arr2 = [1, 2];
$res = array_intersect($arr1, $arr2);
print_r($res);
?>Array
(
[0] => 1
[1] => 2
)Элементы "1" и 1 считаются равными. Для строгого сравнения нужна другая функция.
Новички иногда путают функцию с array_intersect_key.
<?php
// Неверное ожидание: найти элементы с общими ключами.
$arr1 = ['a' => 1, 'b' => 2];
$arr2 = ['a' => 3, 'c' => 4];
$res = array_intersect($arr1, $arr2);
print_r($res); // Пустой массив, т.к. значения 1 и 3 не равны.
?>Array ( )
Изменения в версиях PHP
- PHP 8.0.0: Вызов функции с одним параметром теперь вызывает ошибку уровня
E_WARNING. Ранее функция просто возвращала переданный массив без изменений. Теперь требуется как минимум два аргумента. - PHP 7.4.0: Функция теперь может быть вызвана без аргументов. Ранее требовался как минимум один аргумент. Однако, начиная с PHP 8.0.0, это снова изменилось, как указано выше.
Расширенные примеры
Стандартная функция не сравнивает многомерные массивы рекурсивно. Нужно использовать array_uintersect() с пользовательской функцией сравнения.
<?php
function compare_arrays($a, $b) {
return strcmp(serialize($a), serialize($b)); // Простой, но неэффективный способ для примера.
}
$arr1 = [['id' => 1], ['id' => 2]];
$arr2 = [['id' => 2], ['id' => 3]];
$result = array_uintersect($arr1, $arr2, 'compare_arrays');
print_r($result);
?>Array
(
[1] => Array
(
[id] => 2
)
)Сравнение объектов по свойству.
<?php
class Product {
public function __construct(public int $id) {}
}
$products1 = [new Product(1), new Product(2)];
$products2 = [new Product(2), new Product(3)];
$result = array_uintersect($products1, $products2,
fn($a, $b) => $a->id <=> $b->id);
print_r($result);
?>Array
(
[1] => Product Object
(
[id] => 2
)
)Нахождение пересечения по конкретному столбцу ассоциативных массивов.
<?php
$users1 = [
['id' => 1, 'name' => 'Alice'],
['id' => 2, 'name' => 'Bob']
];
$users2 = [
['id' => 2, 'name' => 'Robert'],
['id' => 3, 'name' => 'Charlie']
];
// Извлекаем столбец 'id' и находим пересечение по ним.
$ids1 = array_column($users1, 'id');
$ids2 = array_column($users2, 'id');
$common_ids = array_intersect($ids1, $ids2);
// Фильтруем первый массив по общим id.
$result = array_filter($users1, fn($user) => in_array($user['id'], $common_ids));
print_r($result);
?>Array
(
[1] => Array
(
[id] => 2
[name] => Bob
)
)Аналоги в других языках
Array intersect в Python
Используют преобразование в тип set и метод intersection().
list1 = [1, 2, 3, 4]
list2 = [3, 4, 5, 6]
result = list(set(list1).intersection(list2))
print(result) # [3, 4]Array intersect в Javascript
Можно использовать метод filter() и includes(). В ES6 есть Set.
const array1 = [1, 2, 3, 4];
const array2 = [3, 4, 5, 6];
const result = array1.filter(value => array2.includes(value));
console.log(result); // [3, 4]Array intersect в MySQL
Оператор INTERSECT (появился в MySQL 8.0.31). Работает с результирующими наборами запросов.
SELECT column FROM table1
INTERSECT
SELECT column FROM table2;Отличие от PHP: в Python и JavaScript часто требуется явное преобразование типов. В MySQL работа идет с таблицами. PHP функция сохраняет ключи и порядок из первого массива, что не всегда аналогично поведению в других языках.