Maison  >  Article  >  développement back-end  >  Comment filtrer les lignes qui se chevauchent dans des tableaux 2D à l'aide de la fonction `array_diff_assoc()` de PHP ?

Comment filtrer les lignes qui se chevauchent dans des tableaux 2D à l'aide de la fonction `array_diff_assoc()` de PHP ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-25 11:17:30113parcourir

How to Filter Overlapping Rows in 2D Arrays Using PHP's `array_diff_assoc()` Function?

Filtrage des lignes d'un tableau 2D basé sur des lignes qui se chevauchent

En PHP, la fonction array_diff_assoc() est couramment utilisée pour déterminer la différence entre deux tableaux. Cependant, dans certains scénarios impliquant des tableaux 2D, les utilisateurs peuvent rencontrer des résultats inattendus lorsqu'ils tentent de filtrer les lignes qui se chevauchent.

Un utilisateur a signalé avoir utilisé array_diff_assoc() pour comparer deux tableaux 2D, mais a remarqué que le résultat contenait des lignes communes aux deux. tableaux au lieu de seulement les lignes uniques. Pour comprendre le problème, examinons les exemples de données fournis par l'utilisateur :

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

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

Après avoir appelé array_diff_assoc($array1, $array2), l'utilisateur s'attendait à recevoir une sortie contenant uniquement la ligne unique de $array1. (c'est-à-dire '[12 => 'nouveaux ensembles q']'). Cependant, le résultat réel était :

[
    [11 => 'common set']
]

Le problème réside dans la façon dont PHP compare les valeurs dans array_diff_assoc(). Deux valeurs sont considérées comme égales uniquement si elles sont strictement égales en tant que chaînes. Dans le cas des tableaux 2D fournis, la valeur associée à la clé '11' dans les deux tableaux est la chaîne 'common set'. Cependant, les paires clé-valeur elles-mêmes ne sont pas identiques aux tableaux.

En conséquence, lorsque array_diff_assoc() compare les deux tableaux, il constate que la paire clé-valeur [11 => 'common set'] est commun aux deux tableaux et l'exclut de la différence. Ce comportement provient du fait que tous les tableaux en PHP sont représentés en interne par la chaîne "Array".

Pour résoudre ce problème, on peut utiliser une approche différente pour filtrer les lignes qui se chevauchent entre les tableaux 2D. Une méthode courante consiste à créer un identifiant unique pour chaque ligne et à utiliser cet identifiant comme clé pour un tableau associatif. Voici un exemple :

$uniqueIdentifiers = [];
$filteredRows = [];

foreach ($array1 as $row) {
    $uniqueIdentifier = implode('|', array_values($row));
    $uniqueIdentifiers[$uniqueIdentifier] = true;
}

foreach ($array2 as $row) {
    $uniqueIdentifier = implode('|', array_values($row));
    if (isset($uniqueIdentifiers[$uniqueIdentifier])) {
        unset($uniqueIdentifiers[$uniqueIdentifier]);
    }
}

foreach ($uniqueIdentifiers as $uniqueIdentifier => $isPresent) {
    $filteredRows[] = array_values(array_flip(explode('|', $uniqueIdentifier)));
}

Cette approche crée un identifiant unique pour chaque ligne en concaténant les valeurs du tableau et en l'utilisant comme clé. Il parcourt ensuite le deuxième tableau et supprime tous les identifiants uniques correspondants de la liste. Enfin, il parcourt les identifiants uniques restants, retourne les clés et les valeurs pour reconstruire les lignes et les ajoute au tableau $filteredRows.

En utilisant cette méthode, vous pouvez filtrer efficacement les lignes qui se chevauchent entre les tableaux 2D. tout en garantissant que les lignes uniques sont correctement identifiées et renvoyées dans le résultat.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn