Avatar billede Computernørderne Juniormester
09. juli 2015 - 21:03 Der er 3 kommentarer og
1 løsning

Sammenligning af arrays, resultat i procenter

Hej alle nørder derude!

Jeg vil gerne lave en side hvor der kan findes opskrifter efter ingredienser. Men hvordan får jeg resultater i procenter?

Uddybning:

Pizza 1 indeholder ost, tomat, skinke, oksekød og ananas.
Pizza 2 indeholder ost, tomat, bacon, kapers og salat
Pizza 3 indeholder tomat, salat og ananas

Hvis jeg leder efter en pizza, som indeholder ost og tomat, så matcher 1 og 2 100%, og 3 50%.
Hvis jeg leder efter en pizza, som indeholder tomat, matcher alle 100%
Hvis jeg leder efter en pizza, som indeholder ost, tomat og skinke, matcher 1 100, 2 66,67% og 3 33,33%.
Det er nemt nok at lave.
Men sæt nu at jeg leder efter en pizza, som indeholder ost, tomat, skinke, bacon, oksekød og ananas. Så har jeg FLERE ingredienser i mit ønskeliste end hver eneste pizza indeholder, men pizza 1 matcher mere end pizza 2, som på sin tur matcher mere end pizza 3. Men hvor mange procent? Og vigtigere: hvordan programmerer jeg det i php? array_intersect()? array_diff()? Eller en kombination? Eller noget andet?

Og hvad, hvis det bliver endnu mere indviklet: jeg vil have en pizza som indeholder ost, skinke og bacon, men jeg vil ikke have ananas! Hvordan laver jeg sådan en?
Jeg forestiller mig at jeg har en række arrays for pizzaerne:
$pizza[0]=['ost','tomat','skinke','oksekød','ananas'];
$pizza[1]=['ost','tomat','bacon','kapers','salat'];
$pizza[2]=['tomat','salat','ananas'];

Derudover har jeg en $included_wish og en $excluded_wish:
$included_wish=['ost','skinke','bacon'];
$excluded_wish=['ananas'];

Nogen der kan komme med et lys idé?

Albert
Avatar billede arne_v Ekspert
11. juli 2015 - 03:18 #1
Mit bud:


<?php
$pizzas = array(
    'pizza 1' => array('ost','tomat','skinke','oksekød','ananas'),
    'pizza 2' => array('ost','tomat','bacon','kapers','salat'),
    'pizza 3' => array('tomat','salat','ananas')
);

function find_best_matches($pizzas, $included, $excluded = array()) {
    $result = array();
    foreach($pizzas as $name => $ingredients) {
        if(count(array_intersect($ingredients, $excluded)) === 0) {
            $score = count(array_intersect($ingredients, $included))/count($included);
            if($score > 0) {
                $result[$name] = $score;
            }
        }
    }
    arsort($result);
    return $result;   
}

function test($included, $excluded = array()) {
    global $pizzas;
    $result = find_best_matches($pizzas, $included, $excluded);
    echo implode('+',$included) . ":\r\n";   
    foreach($result as $pizza => $score) {
        echo "$pizza : $score\r\n";
    }
}

test(array('ost','tomat'));
test(array('tomat'));
test(array('ost','tomat','skinke'));
test(array('ost','tomat','skinke','bacon','oksekød','ananas'));
test(array('ost','skinke','bacon'));
test(array('ost','skinke','bacon'), array('ananas'));

?>
Avatar billede Computernørderne Juniormester
11. juli 2015 - 15:48 #2
Hej arne_v

Mange tak! Det kan absolut bruges. Jeg tester nok lidt, og laver lidt om i koden, men du har i hvert fald hjulpet mig.

Det er ret længe siden at jeg har brugt eksperten. Jeg kan ikke se om du har skrevet et "forslag" eller et "svar", men jeg skal bruge et "svar" for at give dig points.
Avatar billede arne_v Ekspert
11. juli 2015 - 19:22 #3
kommer her
Avatar billede Computernørderne Juniormester
11. juli 2015 - 22:24 #4
'sgo
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

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