Home >Backend Development >PHP Tutorial >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?

Linda Hamilton
Linda HamiltonOriginal
2024-10-26 06:24:30695browse

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:

<code class="php">$array1 = [
    [12 => 'new q sets'],
    [11 => 'common set']
];

$array2 = [
    [11 => 'common set']
];</code>

Incorrect Output

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

<code class="php">$output = array_diff_assoc($array1, $array2);

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

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:

<code class="php">Array ( [0] => "Array" [1] => "Array" )
Array ( [0] => "Array" )</code>

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:

<code class="php">$filteredRows = array_filter($array1, function($row) use ($array2) {
    return !in_array($row, $array2);
});

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

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.

The above is the detailed content of How to Filter Rows from a 2D Array Based on Intersection with Another 2D Array in PHP?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn