Avatar billede sthen Nybegynder
26. oktober 2004 - 20:57 Der er 2 kommentarer og
1 løsning

Sortering af kommasepererede informationer fra MySQL

Lidt forhistorie:

Er ved at lave hjemmeside for en indkøbsforening.
Indkøbsforeningen har aftaler med en mængde firmaer, som hver især tilbyder forskellige produkter til favorable priser til indkøbsforeningens medlemmer.

Har derfor hvert firma i en tabel med firmaoplysninger, herunder hvilke varer de tilbyder.
Disse varer er indskrevet i en celle adskilt af et komma - alt skrevet med små bogstaver.

Nu vil jeg gerne have en oversigt over hvilke varer der tilbydes, og denne oversigt skal samtidig sorteres alfabetisk. Er der gengangere i varerne skal disse fjernes fra outputtet, i lighed med hvis man bruger DISTINCT i SQL SELECTEN. Dette kan blot ikke bruges her, da der kan værer forskellige varer i hver celle og ligeledes sammenfald.
F.eks. hvis firma 1 leverer øl og sodavand men firma 2 leverer øl og vin. Her vil jeg så kun have outputtet til at være sodavand, vin, øl.

Har selv hekset følgende sammen, men kan det mon ikke laves kønnere og fiksere. Desuden fejler det også hvis sidste post i sidste celle har en genganger - så får jeg samme output 2 gange.

<?
$p=0;

include('../connect/connect.php');

($res = mysql_query("select * from aftaler")) || die(mysql_error());
while($data = mysql_fetch_array($res)) {
    if ($data['vare_nr']!=""){
        $alle = explode(",",$data['vare_nr']); 
        for ($i=0;$i<count($alle);$i++){       
            $sorter[$p] = $alle[$i]; 
            $c=0;
            for ($f=0;$f<count($sorter) && $c==0;$f++){
                if($f!=$p){
                    if(strstr($sorter[$f], $alle[$i]) && strlen($sorter[$f]) == strlen($alle[$i])){
                        $c = 1;
                        }
                        else
                        {
                        $c=0;
                    }
                }
            }
        if($c==0){
            $p++;
            }

        }
    }
}


sort($sorter);
for ($s=0;$s<count($sorter);$s++){
    echo $s." ".$sorter[$s]."<br>";
}


?>
Avatar billede fojensen Nybegynder
26. oktober 2004 - 21:30 #1
jeg håber at grunden til at den ind imellem fejler er pga. din egen sortering af dubletter.
Jeg har tidligere nørklet med noget tilsvarende, men fik senere kendskab til funktionen array_unique()

---- kode utestet ----
<?php
include('../connect/connect.php');

($res = mysql_query("select * from aftaler")) || die(mysql_error());
while($data = mysql_fetch_array($res)) {
    if ($data['vare_nr']!=""){
        $alle = explode(",",$data['vare_nr']); 
        for ($i=0;$i<count($alle);$i++){
            $sorterings_array[] = $alle[$i];
        }
    }
}

$sorteret_array = array_unique ($sorterings_array); // fjerner dubletter fra $sorterings_array
sort($sorteret_array);  // sorterer og giver array nye nøgler der starter med 0

for ($s=0;$s<count($sorteret_array);$s++){
    echo $s." ".$sorteret_array[$s]."<br>";
}

?>
---- /kode utestet ----
Avatar billede sthen Nybegynder
26. oktober 2004 - 21:36 #2
Du er en helt.
Tak for hjælpen
Avatar billede sthen Nybegynder
26. oktober 2004 - 23:52 #3
Med lidt kosmetik på, hedder den totale kode nu:

<?php
include('../connect/connect.php');

($res = mysql_query("select * from aftaler")) || die(mysql_error());
while($data = mysql_fetch_array($res)) {
    if ($data['vare_nr']!=""){
        $alle = explode(",",$data['vare_nr']); 
        for ($i=0;$i<count($alle);$i++){
            $sorterings_array[] = $alle[$i];
        }
    }
}

$sorteret_array = array_unique ($sorterings_array); // fjerner dubletter fra $sorterings_array
sort($sorteret_array);  // sorterer og giver array nye nøgler der starter med 0

$f=1;

echo "<table border=\"0\" cellspacing=\"0\">\n";

    for ($s=0;$s<count($sorteret_array);$s++){

            $f=$f+1;
            if ($f%2) {
            $farve = "#ffffff";
            } else {
              $farve = "#CFD9D1";
            }

    echo "<tr style=\"background-color:".$farve.";\"><td width=\"250\" style=\"padding:2px 5px 2px 5px;\"><b>".$sorteret_array[$s]."</b></td>";

    $antal=0;

    ($result = mysql_query("select * from aftaler where vare_nr LIKE '$sorteret_array[$s],%' OR vare_nr LIKE '%,$sorteret_array[$s]' OR vare_nr LIKE '%,$sorteret_array[$s],%' OR vare_nr = '$sorteret_array[$s]' ORDER BY lev_navn ")) || die(mysql_error());
    while($dat = mysql_fetch_array($result)) {

        if ($antal==0){

        echo "<td style=\"padding:0px 5px 0px 5px;\">".$dat['lev_navn']."</td></tr>\n";
        $antal++;
        }
    else
        {
        echo "<tr style=\"background-color:".$farve.";\"><td style=\"padding-left:5px;\"><b> -- \" --</b></td><td style=\"padding:0px 5px 0px 5px;\">".$dat['lev_navn']."</td></tr>\n";
        }
    }
}

echo "</table>";

?>

---- /kode testet ----
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