"If a worker wants to do his job well, he must first sharpen his tools." - Confucius, "The Analects of Confucius. Lu Linggong"
Front page > Programming > How to Filter Rows from a 2D Array Based on Intersection with Another 2D Array in PHP?

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

Published on 2024-11-08
Browse:801

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

Filtering Rows of a 2D Array Based on Row Intersections

In PHP, the array_diff_assoc() function is designed to find the difference between two arrays while prioritizing key-value pairs. However, while using this function to filter rows from a 2D array based on intersection with another 2D array, it may not always yield the expected results.

Understanding the Issue

The problem arises due to the strict comparison performed by array_diff_assoc(). It compares string representations of key-value pairs during comparison. This means that even if two key-value pairs contain the same values, they are not considered equal unless their string representations are identical.

Sample Data

Consider the following sample data:

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

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

Incorrect Output

When we attempt to use array_diff_assoc() to filter $array1 based on the rows in $array2, we get an incorrect output:

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

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

This output shows that the common row is present in the result, while the intended output should contain the exclusive row from $array1.

Cause of the Issue

As mentioned earlier, the problem lies in the strict comparison performed by array_diff_assoc(). When comparing the following two arrays:

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

the function returns the different key-value pair as the result because the key-value pairs are not string-identical.

Correct Approach

To address this issue, we can use a slightly different approach that checks for the existence of specific key-values in the arrays:

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

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

This approach uses in_array() to check if each row from $array1 is present in $array2. If a row is not present in $array2, it is included in the filtered results.

Latest tutorial More>

Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.

Copyright© 2022 湘ICP备2022001581号-3