«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как отфильтровать строки из 2D-массива на основе пересечения с другим 2D-массивом в PHP?

Как отфильтровать строки из 2D-массива на основе пересечения с другим 2D-массивом в PHP?

Опубликовано 8 ноября 2024 г.
Просматривать:794

How to Filter Rows from a 2D Array Based on Intersection with Another 2D Array in PHP?

Фильтрация строк двумерного массива на основе пересечений строк

В PHP функция array_diff_assoc() предназначена для поиска разницы между двумя массивами при определении приоритета ключ-значение пары. Однако при использовании этой функции для фильтрации строк из 2D-массива на основе пересечения с другим 2D-массивом она не всегда может дать ожидаемые результаты.

Понимание проблемы

Проблема возникает из-за строгое сравнение, выполняемое array_diff_assoc(). Во время сравнения он сравнивает строковые представления пар ключ-значение. Это означает, что даже если две пары ключ-значение содержат одинаковые значения, они не считаются равными, если их строковые представления не идентичны.

Пример данных

Рассмотрите следующие примеры данных:

$array1 = [
    [12 => 'new q sets'],
    [11 => 'common set']
];

$array2 = [
    [11 => 'common set']
];

Неправильный вывод

Когда мы пытаемся использовать array_diff_assoc() для фильтрации $array1 на основе строк в $array2, мы получаем неправильный вывод:

$output = array_diff_assoc($array1, $array2);

print_r($output);
// Output: [
//     [11 => 'common set']
// ]

Эти выходные данные показывают, что в результате присутствует общая строка, тогда как предполагаемый вывод должен содержать исключительную строку из $array1.

Причина проблемы

Как упоминалось ранее, проблема заключается в строгом сравнении, выполняемом array_diff_assoc(). При сравнении следующих двух массивов:

Array ( [0] => "Array" [1] => "Array" )
Array ( [0] => "Array" )

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

Правильный подход

Чтобы решить эту проблему, мы можем использовать немного другой подход, который проверяет наличие определенных значений ключа в массивах:

$filteredRows = array_filter($array1, function($row) use ($array2) {
    return !in_array($row, $array2);
});

print_r($filteredRows);
// Output: [
//     [12 => 'new q sets']
// ]

Этот подход использует in_array() для проверки наличия каждой строки из $array1 в $array2. Если строка отсутствует в $array2, она включается в отфильтрованные результаты.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3