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
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'));

?>
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.
arne_v Ekspert
11. juli 2015 - 19:22 #3
kommer her
Computernørderne Juniormester
11. juli 2015 - 22:24 #4
'sgo
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

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





Premium
Derfor er SAP ramt af kæmpe nedtur trods stor stigning i indtjeningen
ComputerViews: Mægtige SAP’s markedsværdi er på et øjeblik styrtdykket i den største enkeltstående nedtur for selskabet siden 1999. Selskabet er krise. Se her hvorfor.
Computerworld
Salling Group lukker stor online-satsning efter kun et år
Millionsatsningen Fillop lukker ved årets udgang. I stedet er supermarkeds-giganten Salling Group nu på vej med en række helt nye online-satsninger, der er affødt af coronakrisen.
CIO
Podcast: Hos Viking Life-Saving Equipment er it gået fra at være backend til at være noget, som kunderne spørger aktivt efter
Podcast, The Digital Edge: Viking leverer en stadig større del af deres produkt som en tjeneste. Som en del af tjenesten tager Viking ansvar for sikkerheden ved at levere, dokumentere og vedligeholde det nødvendige sikkerhedsudstyr. Hør hvordan Henrik Balslev senior digital director hos Viking har løftet den opgave.
Job & Karriere
Regner din ferie væk? Brug tiden på at søge en af disse otte stillinger, der er ledige netop nu
Det sjasker ned over hele Danmark. Du kan bruge de våde sommerdage på at søge et af disse otte job, der er ledige lige nu.
White paper
Sådan: Beskyt virksomheden effektivt mod mailbårne angreb
Mailserveren er rykket i skyen, typisk i form af Office 365, men det er truslerne også. For trods højt sikkerhedsniveau hos Microsoft er virksomhederne mindst lige så udsat for mailbårne cyberangreb som førhen. Enten i form af social engineering – hvor angriberne prøver at lokke adgangsgivende informationer ud af medarbejderne, i form af phishing eller gennem deciderede malwareangreb. Dertil kommer forsøg på svindel i form af eksempelvis CEO-fraud, falske fakturaer og meget andet. Denne hvidbog giver et opdateret overblik over angrebsformerne og konkrete bud på, hvordan du bedst forebygger, at din virksomhed rammes.