Avatar billede tigertool Nybegynder
25. juni 2004 - 02:20 Der er 13 kommentarer og
1 løsning

Forskel mellem 2 arrays

Hvis man har 2 arrays hvor array A er f.eks. 11 lang og array B er 16 lang. Man ved at alle værdier fra array A indegår i array B, hvordan finder man så ud af hvilke der ikke er i fællesmængden af disse 2 arrays?
(Værdierne i arrayene er ikke unikke)

Et eksepmel:
A ('A','B','C','D','F','A','E','T','Y','W','A')
B ('A','B','C','E','G','V','U','D','F','A','E','T','Y','I','W','A')

Her er plads 3,4,5,6,13 i B ikke med i A.
Avatar billede tigertool Nybegynder
25. juni 2004 - 02:22 #1
Det kan også siges på en anden måde, hvad skal der lægges ind i A (og på hvilke pladser) for at det ligner B?
Avatar billede dennismp Nybegynder
25. juni 2004 - 02:47 #2
array_diff($a,$b) kan fortælle dig forskellen på de to arrays.
Avatar billede tigertool Nybegynder
25. juni 2004 - 02:53 #3
Jeg får et tomt Array retur..
Jeg tror at problemet er at array_diff() kun returnere de værdier som ikke er i begge arrays. Men i mit spm kan en værdi godt gå igen.

Det er nok lettere at spørge: Hvad skal jeg lægge ind i array A for at få array B (og på hvilke pladser)?
Avatar billede dennismp Nybegynder
25. juni 2004 - 03:02 #4
$missing = array();
foreach($b as $key => $val) {
  if(!in_array($val,$a) ) {
    $missing[] = $key .':' . $val;
  }
}

print join(', ',$missing);
Avatar billede coderdk Praktikant
25. juni 2004 - 11:28 #5
Eeerh, array_diff burde være præcist hvad du leder efter.

<?php

    $a = array('A','B','C','D','F','A','E','T','Y','W','A');
    $b = array('A','B','C','E','G','V','U','D','F','A','E','T','Y','I','W','A');
    $r = array_diff( $b, $a );
    print_r( $r );

?>

Bemærk at det ikke virker med $a, $b :P hehe
Avatar billede tigertool Nybegynder
25. juni 2004 - 13:46 #6
Jeg må give jer ret i at det virker udfra det lille eksempel jeg har skrevet.. Men hvad nu hvis de 2 arrays ser således ud:

$a = array('A','B','C','D','F','A','E','T','Y','W','A');
$b = array('A','B','C','A','C','E','A','D','F','A','E','T','Y','B','W','A');

Hvad skal der nu tilføjes i $a for at det ligner $b?
Avatar billede coderdk Praktikant
25. juni 2004 - 13:56 #7
$a = array('A','B','C','D','F','A','E','T','Y','W','A');
    $b = array('A','B','C','E','G','V','U','D','F','A','E','T','Y','I','W','A');

    echo "<pre>";
    // Differencen:
    var_dump( array_values( array_diff( $b, $a ) ) );

    // Det kombinerede array:
    var_dump( array_merge( array_values( array_diff( $b, $a ) ), $a ) );

    // Kombinerede unikke array:
    var_dump( array_unique( array_merge( $a, $b ) ) );


Men vil du have det til at INDEHOLDE det samme, eller være helt ens?
Avatar billede tigertool Nybegynder
25. juni 2004 - 13:57 #8
Være helt ens.
Avatar billede coderdk Praktikant
25. juni 2004 - 13:58 #9
Hmm jeg brugte ikke dit eksempel kan jeg se...
Avatar billede tigertool Nybegynder
25. juni 2004 - 13:59 #10
var_dump( array_values( array_diff( $b, $a ) ) ); <- giver et array(0) {}
Avatar billede coderdk Praktikant
25. juni 2004 - 14:02 #11
Hmmm... array_diff kan ikke bruges, da du har dubletter - du har f.eks. flere A'er i begge arrays... Så skal du selv kode en dims der kan give dig resultatet
Avatar billede tigertool Nybegynder
25. juni 2004 - 14:05 #12
ja! Problemet er bare at jeg er løbet tør for ideer.. Jeg har kodet det meste af natten..

Jeg har bl.a. en ide om at man kunne forespørge hvis de ikke var ens, så kunne man lægge 1 til og se om f.eks. $a[3] == $b[3 + 1] hvor [1...n] (n: [1... (count($b) - count($a))]).. Men jeg kunne ikke rigtigt få det kodet...
Avatar billede coderdk Praktikant
25. juni 2004 - 14:16 #13
Værsgo:

    $a = array('A','B','C','D','F','A','E','T','Y','W','A');
    $b = array('A','B','C','A','C','E','A','D','F','A','E','T','Y','B','W','A');

    function arrdiff( $bigger, $smaller )
    {
        $keys = array();
        $cA = count( $smaller );
        $cB = count( $bigger );
        $idxB = 0;
        for ( $idxA = 0; $idxA < $cA; $idxA++ )
        {
            while ( $idxB < $cB )
            {
                if ( $smaller[ $idxA ] == $bigger[ $idxB ] )
                {
                    $idxB++;
                    break;
                }
                else
                {
                    $keys[] = $idxB;
                }
                $idxB++;
            }
        }
        return $keys;
    }

    $missingIdxes = arrdiff( $b, $a );

    echo "<pre>";
    var_dump( $missingIdxes );
Avatar billede tigertool Nybegynder
25. juni 2004 - 16:33 #14
NIce :)

Det virker.. takker coderdk
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester