Fusionner 2 tableaux

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
antore
Niveau 1
Niveau 1
Messages : 1
Enregistré le : lun. 19 avr. 2021 14:54
Status : Hors ligne

Fusionner 2 tableaux

#1

Message par antore »

Bonjour

Je cherche à fusionner 2 tableaux en 1 seul avec en point de comparaison la même valeur

Local $nombre[5][2] = [["Valeur 1", "11"], ["Valeur 2", "22"], ["Valeur 3", "33"], ["Valeur 4", "44"], ["Valeur 5", "55"]]
Local $lettre[5][2] = [["Valeur 1", "aa"], ["Valeur 2", "bb"], ["Valeur 3", "cc"], ["Valeur 4", "dd"], ["Valeur 5", "ee"]]

j'aimerai avoir ce résultat

valeur 1 11 aa
valeur 2 22 bb
valeur 3 33 cc
valeur 4 44 dd
valeur 5 55 ee

je vous remercie
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2086
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: Fusionner 2 tableaux

#2

Message par TommyDDR »

Voilà une fonction qui fusionnera 2 tableaux en gérant à peu près tous les cas
  • "Valeur X" présent dans $nombre mais pas dans $lettre
  • "Valeur X" présent dans $lettre mais pas dans $nombre
  • Plusieurs "Valeur X" identiques présents dans $lettre
  • Plusieurs "Valeur X" identiques présents dans $nombre
  • Nombre de valeurs par tableau pouvant être ajouté : infini :P
Vous pouvez même rappeler fusion avec le retour du 1er + un nouveau tableau

Voici un exemple où l'on passe par tous ces cas :
#include <Array.au3>

Local $nombre = [["Valeur 1", "11"], ["Valeur 2", "22"], ["Valeur 2", "yy"], ["Valeur 3", "33"], ["Valeur 4", "44"], ["Valeur 5", "55"]]
Local $lettre = [["Valeur 1", "aa", "zzz"], ["Valeur 2", "bb"], ["Valeur 3", "cc"], ["Valeur 4", "dd"], ["Valeur 4", "dddd"], ["Valeur 6", "ee"]]
Local $special = [["Valeur 1", "$$"], ["Valeur 2", "%%"], ["Valeur 3", ".."], ["Valeur 4", "**"], ["Valeur 5", ";;;"], ["Valeur 7", "//"]]

Local $fusion = fusion($nombre, $lettre)
$fusion = fusion($fusion, $special)

_ArrayDisplay($fusion)

Func fusion($tab1, $tab2)
   If(UBound($tab1, 0) <> 2 Or UBound($tab2, 0) <> 2) Then Return SetError(1)

   Local $fusion[0][1]
   Local $keys[0]
   Local $tabs = [$tab1, $tab2]

   For $tabId = 0 To UBound($tabs, 1) - 1
      Local $tab = $tabs[$tabId]
      For $i = 0 To UBound($tab, 1) - 1
         _ArrayAdd($keys, $tab[$i][0])
      Next
   Next
   $keys = _ArrayUnique($keys, 0, 0, 0, 0)

   ReDim $fusion[UBound($keys, 1)][UBound($fusion, 2)]

   For $i = 0 To UBound($keys, 1) - 1
      Local $count = 0
      $fusion[$i][$count] = $keys[$i]
      $count += 1
      For $tabId = 0 To UBound($tabs, 1) - 1
         Local $tab = $tabs[$tabId]
         Local $idxTab = _ArrayFindAll($tab, $keys[$i])
         For $j = 0 To UBound($idxTab, 1) - 1
            For $k = 1 To UBound($tab, 2) - 1
               Local $val = $tab[$idxTab[$j]][$k]
               If($val <> "") Then
                  If($count >= UBound($fusion, 2)) Then
                     ReDim $fusion[UBound($fusion, 1)][$count+1]
                  EndIf
                  $fusion[$i][$count] = $val
                  $count += 1
               EndIf
            Next
         Next
      Next
   Next

   Return $fusion
EndFunc
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Répondre