Intersection de tableaux PHP. Théorie des ensembles - PHP : Tableaux - Hexlet

Tâche
Il y a deux tableaux et vous souhaitez trouver leur union (tous les éléments, mais si un élément est dans les deux tableaux, il est compté une fois), leur intersection (éléments dans les deux tableaux) ou leur différence (éléments d'un tableau qui ne sont pas dans l'autre).

Solution
Pour définir une union :
$union = array_unique(array_merge($a, $b));

Pour calculer l'intersection :
$intersection = tableau_intersection($a, $b);

Pour trouver une différence simple :
$différence = array_diff($a, $b);

Et pour obtenir la différence symétrique (OU exclusif) :

Discussion
La plupart des composants requis pour de tels calculs sont intégrés à PHP ; il vous suffit de les combiner dans l'ordre approprié.

Lorsqu'une union est obtenue à partir de deux tableaux, un tableau géant est créé avec toutes les valeurs des tableaux d'origine. Mais la fonction array_merge() permet des valeurs en double lors de la fusion de deux tableaux numériques, vous devez donc appeler la fonction array_unique(),
pour filtrer ces éléments.

Cependant, cela peut entraîner des lacunes car la fonction array_unique() ne compacte pas le tableau. Cependant, ce n'est pas un problème car l'instruction foreach et la fonction each() gèrent sans interférence des tableaux peu peuplés.

La fonction de calcul de l'intersection s'appelle simplement array_intersection() et ne nécessite aucun effort supplémentaire.

La fonction array_diff() renvoie un tableau contenant tous les éléments uniques du tableau $old qui ne sont pas dans le tableau $new. C'est ce qu'on appelle une différence simple :


$différence = array_diff($ancien, $nouveau);
Tableau
=> non
=> à
)

Le tableau $difference résultant contient "not" et "to" car array_diff() est sensible à la casse. Il n'inclut pas l'élément "whatever" car il ne se trouve pas dans le tableau $old.

Pour obtenir la différence inverse, ou, en d'autres termes, pour trouver les éléments uniques du tableau $new qui manquent dans le tableau $old, vous devez échanger les arguments :
$old = array("À", "être", "ou", "ne pas", "à", "être");
$new = array("À", "être", "ou", "peu importe");
$reverse_diff = array_diff($nouveau, $ancien);
Tableau
=> peu importe
)

Le tableau $reverse_diff contient uniquement l'élément "whatever".

Si vous devez appliquer une fonction ou un autre filtre dans la fonction array_diff(), créez votre propre algorithme de différence (soustraction) :

// applique un algorithme de soustraction insensible à la casse ; différence -je
$vu = tableau();
foreach ($nouveau comme $n) (
$vu++;
}
foreach ($ancien comme $o) (
$o = strtoinférieur($o);
si (!$seen[$o]) ( $diff[$o] = $o; )
}

La première instruction foreach crée un tableau associatif pour une recherche plus approfondie.

Ensuite, il parcourt le tableau $old et, si l'élément n'est pas trouvé lors de la recherche, il est ajouté au tableau $diff.

Ce processus peut être accéléré en combinant les fonctions array_diff() et array_map() :

$diff = array_diff(array_map("strtolower", $old),
array_map("strtolower", $new));

La différence symétrique est ce qui est dans $a mais pas dans $b, plus ce qui est dans $b mais pas dans $a :

$différence = array_merge(array_diff($a, $b), array_diff($b, $a));

Une fois établi, l’algorithme avance. La fonction array_diff() est appelée deux fois et détermine deux différences. Ils sont ensuite regroupés en un seul tableau. Il n'est pas nécessaire d'appeler array_unique() puisque ces tableaux ont été spécialement conçus pour n'avoir aucun élément commun.

Théorie des ensembles. Je sais combien de personnes ont peur des mathématiciens, mais la théorie des ensembles (naïve) est très simple et compréhensible. De plus, nous utilisons constamment ses éléments dans la vie de tous les jours. Et en programmation, cela se produit à chaque étape.

Étonnamment, le concept de base de la théorie des ensembles est beaucoup. Un ensemble désigne une collection d’objets de nature arbitraire, considérés comme un tout unique. L'exemple le plus simple- des chiffres. L'ensemble de chiffres arabes comprend 10 éléments et est final. Le concept de finitude est intuitif et signifie qu’un ensemble possède un nombre fini d’éléments.

Un exemple d’ensemble infini est celui des nombres naturels. À son tour, l’ensemble des nombres naturels est un sous-ensemble d’entiers, qui à leur tour sont un sous-ensemble de nombres rationnels, et ainsi de suite.

« Sous-ensemble » signifie que tous les éléments d'un ensemble sont également inclus dans un autre ensemble, appelé surensemble(par rapport à un sous-ensemble).

Représenter des ensembles par des cercles est très pratique. Vous pouvez rapidement évaluer les relations entre les différents ensembles.

Mais les objets mathématiques tels que les nombres ne sont pas les seuls objets possibles des ensembles. Un ensemble peut être appelé un groupe de personnes debout à un arrêt de bus attendant leur bus, ou des résidents d'appartements dans une maison, une ville ou un pays. Toute collection de tous objets que nous voulons considérer comme un tout.

L'essentiel pour nous dans la théorie des ensembles, ce sont les opérations sur eux. Ceux-ci incluent : l'addition, l'union, l'intersection, la différence, le produit cartésien et quelques autres.

Un exemple simple. Lorsque vous visitez la page Facebook d'une autre personne, Facebook vous montre un blocage avec des amis communs. Si nous supposons que vos amis et les amis de votre ami forment deux ensembles, alors les amis communs sont l'ensemble obtenu à l'intersection des ensembles d'amis d'origine.

Passant à la programmation, vous remarquerez qu’un tableau est très similaire à un ensemble, et il peut en effet être considéré comme tel. Pourquoi est-ce si important ? En comprenant les principes sur lesquels reposent certaines opérations, vous pourrez les mettre en œuvre de la manière la plus rapide et la plus efficace. de manière efficace. Par exemple, sachant que vous avez besoin d'une opération d'intersection définie en php, vous pouvez essayer de trouver une fonction qui effectue la tâche. Pour ce faire, saisissez simplement la requête dans Google : php ensemble intersection(ensemble - ensemble, intersection - intersection). Le premier lien (du moins pour moi) dans les résultats de recherche mène à la fonction array_intersect souhaitée. La même chose vous attend avec d'autres opérations. Il s'agit d'une réponse partielle à la question « les programmeurs ont-ils besoin de mathématiques ?

À propos, toutes les langues n'ont pas de fonctions intégrées pour travailler avec des ensembles. Dans certains, vous devez installer des bibliothèques supplémentaires pour cela, et dans certains, par exemple dans Ruby, les opérations avec des ensembles sont implémentées à l'aide d'opérateurs arithmétiques (union d'ensembles : coll1 + coll2).

Par ailleurs, il convient de dire que les bases de données relationnelles sont construites sur les idées de l'algèbre relationnelle, dans laquelle la théorie des ensembles joue un rôle central. Les bases de données font partie intégrante du développement Web et nous les connaîtrons plus tard.

Regardons les opérations de base :

Intersection

L'intersection d'ensembles est un ensemble qui comprend des éléments qui apparaissent simultanément dans tous les ensembles donnés.

["vasya", "petya"]

Cette fonction accepte n'importe quel nombre de tableaux. Autrement dit, vous pouvez trouver l'intersection de n'importe quel nombre de tableaux en un seul appel.

Association

Une union d’ensembles est un ensemble qui contient des éléments de tous les ensembles donnés. L'union définie en PHP ne peut pas être réalisée avec un seul appel, mais elle peut être simulée en connectant deux fonctions :

["vasya", "kolya", "petya", "igor", "petya", "sergey", "vasya", "sasha"]; // unique supprime les doublons $sharedFriends = array_unique($friends); // => ["vasya", "kolya", "petya", "igor", "sergey", "sasha"]

Ajout (différence)

La différence entre deux ensembles est un ensemble qui comprend des éléments du premier ensemble qui ne sont pas inclus dans le second. En programmation, cette opération est souvent appelée différence.

["kolia"]

Appartenant à la multitude

Vous pouvez vérifier si un élément appartient à un ensemble en utilisant la fonction in_array :

Ces fonctions vous permettent de manipuler les tableaux de différentes manières. Les tableaux sont idéaux pour stocker, modifier et travailler avec des ensembles de variables.

Les tableaux unidimensionnels et multidimensionnels sont pris en charge, à la fois créés par l'utilisateur et renvoyés par une fonction. Il existe des fonctions spéciales pour travailler avec des bases de données qui facilitent le travail avec des tableaux de données renvoyées à la suite de l'exécution de requêtes ;

Il existe également des fonctions qui renvoient des tableaux comme résultats.

Pour en savoir plus sur la façon dont les tableaux sont créés et utilisés en PHP, consultez le chapitre Tableaux de ce didacticiel.

Installation

Aucune installation n'est requise pour utiliser ces fonctionnalités car elles font partie du noyau PHP.

Constantes prédéfinies

Les constantes répertoriées ci-dessous sont toujours disponibles dans le cadre du noyau PHP. CASE_LOWER

Les constantes répertoriées ci-dessous sont toujours disponibles dans le cadre du noyau PHP.(entier) utilisé avec la fonction array_change_key_case() utilisé avec la fonction pour indiquer si les clés du tableau doivent être converties en caractères minuscules. Fonction par défaut

Cette constante est utilisée. CASE_LOWER

Cette constante est utilisée.(entier) utilisé avec la fonction CASE_UPPER

array_change_key_case -- Renvoie un tableau dont les touches de caractères sont converties en caractères majuscules ou minuscules array_chunk -- Divise un tableau en morceaux array_combine -- Crée un nouveau tableau en utilisant un tableau comme clés et un autre comme valeurs correspondantes array_count_values ​​​​- - Compter le nombre de toutes les valeurs array_diff_assoc -- Calculer la divergence du tableau avec une vérification d'index supplémentaire array_diff_key -- Calculer la divergence du tableau en comparant les clés array_diff_uassoc -- Calculer la divergence du tableau avec une vérification d'index supplémentaire effectuée à l'aide d'une fonction définie par l'utilisateur array_diff_ukey -- Calculer la divergence du tableau en utilisant rappel de comparaison de clés array_diff -- Calculer la divergence du tableau array_fill -- Remplir un tableau avec une valeur spécifique array_filter -- Appliquer un filtre à un tableau à l'aide du rappel array_flip -- Échanger les valeurs du tableau array_intersect_assoc -- Calculer la convergence du tableau avec une vérification d'index supplémentaire array_intersect_key -- Calculer l'intersection du tableau en comparant les clés array_intersect_uassoc -- Calculer l'intersection du tableau avec une vérification d'index supplémentaire effectuée à l'aide de la fonction définie par l'utilisateur array_intersect_ukey -- Calculer l'intersection du tableau à l'aide du rappel de comparaison de clés array_intersect -- Calculer la convergence du tableau array_key_exists -- Vérifier si la clé ou l'index spécifié est présent dans le tableau array_keys -- Sélectionne toutes les clés du tableau array_map -- Applique une fonction de rappel à tous les éléments des tableaux spécifiés array_merge_recursive -- Fusionne récursivement deux ou plusieurs tableaux array_merge -- Fusionne deux ou plusieurs tableaux array_multisort -- Trie plusieurs arrays ou tableaux multidimensionnels array_pad -- Augmenter la taille d'un tableau jusqu'à une valeur donnée array_pop -- Récupérer le dernier élément d'un tableau array_product -- Calculer le produit des valeurs du tableau array_push -- Ajouter un ou plusieurs éléments à la fin de un tableau array_rand -- Sélectionne une ou plusieurs valeurs aléatoires dans array_reduce -- Réduit itérativement un tableau à une seule valeur à l'aide de la fonction de rappel array_reverse -- Renvoie un tableau avec des éléments dans l'ordre inverse array_search -- Recherche dans le tableau une valeur donnée et renvoie la clé correspondante en cas de succès array_shift -- Récupérer le premier élément du tableau array_slice - - Sélectionner une tranche d'un tableau array_splice -- Supprimer une séquence d'éléments du tableau et la remplacer par une autre séquence array_sum -- Calculer la somme des valeurs du tableau ​​array_udiff_assoc -- Calcule la divergence dans les tableaux avec une vérification d'index supplémentaire, en utilisant la fonction de rappel array_udiff_uassoc pour comparer les valeurs -- Calcule la divergence dans les tableaux avec une vérification d'index supplémentaire en utilisant la fonction de rappel array_udiff pour comparer les valeurs et les indices -- Calcule le tableau divergence en utilisant la fonction de rappel array_uintersect_assoc pour comparaison -- Calculer l'intersection de tableaux avec une vérification d'index supplémentaire en utilisant la fonction de rappel array_uintersect_uassoc pour comparer les valeurs -- Calculer l'intersection de tableaux avec une vérification d'index supplémentaire en utilisant le rappel array_uintersect pour comparer les indices et les valeurs -- Calculer l'intersection des tableaux en utilisant le rappel array_unique pour comparer les valeurs -- Supprimer les valeurs en double d'un tableau array_unshift -- Ajouter un ou plusieurs éléments au début du tableau array_values ​​​​-- Sélectionner toutes les valeurs d'un tableau array_walk_recursive -- Appliquer de manière récursive une fonction personnalisée à chaque élément du tableau array_walk -- Appliquer une fonction personnalisée à chaque élément du tableau array -- Créer un tableau arsort -- Trier le tableau dans l'ordre inverse, en préservant le tri des clés -- Trier le tableau, en préservant les clés compactes -- Crée un tableau contenant les noms de variables et leurs valeurs