"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como filtrar linhas de um array 2D com base na interseção com outro array 2D em PHP?

Como filtrar linhas de um array 2D com base na interseção com outro array 2D em PHP?

Publicado em 2024-11-08
Navegar:306

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

Filtrando linhas de um array 2D com base em interseções de linhas

Em PHP, a função array_diff_assoc() foi projetada para encontrar a diferença entre dois arrays enquanto prioriza o valor-chave pares. No entanto, ao usar esta função para filtrar linhas de uma matriz 2D com base na interseção com outra matriz 2D, ela pode nem sempre produzir os resultados esperados.

Compreendendo o problema

O problema surge devido a a comparação estrita realizada por array_diff_assoc(). Ele compara representações de string de pares de valores-chave durante a comparação. Isso significa que mesmo que dois pares de valores-chave contenham os mesmos valores, eles não serão considerados iguais, a menos que suas representações de string sejam idênticas.

Dados de exemplo

Considere os seguintes dados de exemplo:

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

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

Saída incorreta

Quando tentamos usar array_diff_assoc() para filtrar $array1 com base nas linhas em $array2, obtemos uma saída incorreta:

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

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

Esta saída mostra que a linha comum está presente no resultado, enquanto a saída pretendida deve conter a linha exclusiva de $array1.

Causa do problema

Como mencionado anteriormente, o problema está na comparação estrita realizada por array_diff_assoc(). Ao comparar as duas matrizes a seguir:

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

a função retorna o par de valores-chave diferente como resultado porque os pares de valores-chave não são idênticos a strings.

Abordagem correta

Para resolver esse problema, podemos usar uma abordagem um pouco diferente que verifica a existência de valores-chave específicos nas matrizes:

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

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

Esta abordagem usa in_array() para verificar se cada linha de $array1 está presente em $array2. Se uma linha não estiver presente em $array2, ela será incluída nos resultados filtrados.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3