Avatar billede phpbegynder2004 Nybegynder
30. december 2007 - 03:27 Der er 4 kommentarer og
1 løsning

Sammenlign arrays og find ens værdier

Hej php eksperter!

Jeg har lavet et funktion, som jeg føler kan skrives meget bedre.

Det drejer sig om følgende:
Jeg har en hjemmeside med billeder. Hvis en bruger optræder på et billede, kan han trykke "jeg er på billedet". Dette indsætter følgende i databasen:

mysql_query("INSERT INTO billeder_poserer (brugerid, billede_url) VALUES ('$brugerid', '$billede_url')");

Nu kan alle se, at han poserer på dette billede. Så langt så godt. Nu vil jeg gerne finde ud af, hvilke billede _både_ Ida (brugerid 1), Thomas (brugerid 2) og Anton (brugerid 3) poserer på.

Jeg har gjort følgende:


$ider = array("1", "2", "3"); // De brugerid'er der skal optræde på billederne


    foreach($ider as $nr=>$brugerid){
    $arrayet="array".$nr;

    $hent_person = mysql_query("SELECT billede_url FROM billeder_poserer WHERE brugerid='$brugerid'");
      while($row = mysql_fetch_assoc($hent_person)){
      ${$arrayet}[] = $row[billede_url];
      }

    }

$antal = count($ider);

/* Nedenstående er nok lidt dumt. Men jeg ved jo ikke hvor mange arrays jeg skal sammenligne? Altså om det er en 2,3,4 eller fem personer der skal optræde på billederne */

if($antal==2){
  $result = array_intersect($array0,$array1);
}elseif($antal==3){
  $result = array_intersect($array0,$array1,$array2);
}elseif($antal==4){
  $result = array_intersect($array0,$array1,$array2,$array3);
}elseif($antal==5){
  $result = array_intersect($array0,$array1,$array2,$array3,$array4);
}

echo count($result)."<br>";
foreach($result as $url){
echo"<img src=\"billeder/$url\">"; //Udskriver billederne hvor både 1,2 og 3 deltager på
}

Håber I forstår. Ellers spørg endelig!
God jul og på forhpnd tak for hjælpen.

Ps. Hvis det kan løses hurtigere med MySQL, altså før jeg trækker det ud, vil jeg også blive glad for sådan et svar! :)
Avatar billede showsource Seniormester
30. december 2007 - 05:23 #1
jaahh, det er lidt rodet kode du har fået lavet dig der!
Og du kan hente billeder i sql med IN

$ider = array(1,2,3); // Ingen " da det er et tal

$sql = "SELECT billede_url
        FROM billeder_poserer
        WHERE brugerid IN (". implode(",", $ider) .")";

og nok med DISTINCT også

$sql = "SELECT DISTINCT(billede_url)
        FROM billeder_poserer
        WHERE brugerid IN (". implode(",", $ider) .")";
Avatar billede nielle Nybegynder
30. december 2007 - 08:01 #2
Jeg vil mene at denne SQL skulle kunne gøre det:

SELECT *
FROM billede_url
WHERE
billede_url IN (SELECT billede_url FROM billeder_poserer WHERE brugerid = $brugerid1)
AND
billede_url IN (SELECT billede_url FROM billeder_poserer WHERE brugerid = $brugerid2)
AND
billede_url IN (SELECT billede_url FROM billeder_poserer WHERE brugerid = $brugerid3)

Jeg tør dog ikke sige noget om performance i forhold til at gøre det hele ude i PHP-koden.

Den kunne konstrueres sådan:

$ider = array(1, 2, 3);

$sql = "SELECT *
FROM billede_url
WHERE ";

$whereArr = array();
for ($ider as $id) {
    $whereArr[] = "billede_url IN (SELECT billede_url FROM billeder_poserer WHERE brugerid = $id)";
}

$sql .= implode(" AND ", $whereArr[]);



PS: Når du nu bruger prugerid i din tabel, så burde du faktisk også gøre noget lignende med billeder - altså udpege dem ved billedid i stedet for url.
Avatar billede showsource Seniormester
31. december 2007 - 08:41 #3
jahh, nu får vi jo ikke at vide hvorfra 1,2,3 kommer/bliver til, og hvordan visningen af billede skal gøres, ( samme billede flere gange ? )
Avatar billede phpbegynder2004 Nybegynder
02. januar 2008 - 00:16 #4
showsource -> Jeg er ikke helt sikker på hvad din løsning gør, men det outputer i hvert fald mange billeder, hvor ingen af tallene i $ider indgår.

Svaret fra nielle outputtede kun billeder hvor alle tal fra $ider indgik, som det skulle. Dog blev billederne gentaget, men det ordnede sig med DISTINCT.

Nielle er nok den der har hjulpet mig mest, eftersom det er hans løsning jeg bruger.
Så læg et svar nielle :)
Og tak for hjælpen til showsource
Avatar billede nielle Nybegynder
02. januar 2008 - 09:17 #5
showsource's kode burde give dig alle de billeder hvor blot een af personerne er med. Den burde ikke give dig billeder hvor *ingen* var med.

Jeg kan nu ikke lige gennemskue hvorfor du skulle få dubletter med min kode, men hvis en DISTINCT gør det så er det jo fint. :^)
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