Avatar billede hrole Mester
16. juni 2010 - 10:40 Der er 8 kommentarer og
1 løsning

Hjælp til array oprettelse fra mysqldb og dropdown

Hej,

Jeg har en kolonne i en mysqldb med bynavne, opbygningen er fx "Århus, Købehavn, Bogense, Skagen" og "Hjørring, Åbenrå, København".

Det jeg ønsker er at disse skal vises alfabetisk i en dropdowmenu hvor dubletter kun vises én gang.

Jeg har siddet og rodet med følgende:

<?php

$query_by = "SELECT * FROM XXX";
$result_by = mysqli_query($XXX, $query_by);

while ($row = mysqli_fetch_array($result_by)) {

    $by[] = explode(", ", $row['byerne']);

}

    echo '<select name="by" id="by" >';
   
foreach ($by as $g) {

    echo '<option value="'.$g[0].'">'.$g[0].'</option>'."\n";

}
    echo '</select>';
?>

Men der mangler $g[1], $g[2] osv., samt at dubletter viser og det ikke er sorteret alfabetisk.

Kan nogen hjælpe med løsningen?
Avatar billede 2Mida Praktikant
16. juni 2010 - 10:52 #1
Du skal bruge DISTINCT (fjerner dubletter) og ORDER BY (rækkefølge)

..Ole
Avatar billede hrole Mester
16. juni 2010 - 11:00 #2
jo, men hvis det skal gøre i selve queryen, hvordan bruger jeg explode i queryen?
Avatar billede showsource Seniormester
16. juni 2010 - 13:09 #3
Er det kun et row i db med bynavne, a'la'
Århus,Odense,Skagen
???

$by[] = explode(", ", $row['byerne']);
sort($by);

foreach($by as $g) {

echo $g."<br>";

}

du skal ikke bruge $g[0]


og det vil være bedre med et row for hver bynavn.
Avatar billede hrole Mester
16. juni 2010 - 13:17 #4
Ja, en row med bynavnene. Altså db opbygningen er:
id - noget - byerne
1 - æble - Århus, Skagen, Odense
2 - pære - København, Esbjerg, Thisted, Odense
3 - banan - Skagen, Gedser
osv.

Dit forslag indsat i min kode giver en dropdown hvor der står Array et antal gange. Og desuden kan jeg ikke se der tages hensyn til dubletter.
Avatar billede showsource Seniormester
16. juni 2010 - 13:38 #5
Det var hvis der kun var et row.

Overvej lige at ændre opbygning af tabel !!!
while ....
$by[] = $row['byerne'];
end while


for($i = 0; $i < count($by); $i++) {

$g[] = explode(",", $by[$i]);

$byer = array_unique($g);
sort($byer);

    foreach($byer as $city) {
    echo $city."<br>";
    }

}

Aldeles utestet !
16. juni 2010 - 14:17 #6
hrole, jeg forstaar at din mysql tabel har en struktur i retning af dette:

TABELX
ID noget byerne
1  "noget1"  "Aarhus, Koebenhavn, Bogense, Skagen"
2  "noget2"  "Hjoerring, Aabenraa, Koebenhavn"
3  "noget3"  "Odense, Bogense, Koebenhavn"

Og saa vil du have en dropdown menu med dette:

Bogense
Hjoerring
Koebenhavn
Odense
Skagen
Aabenraa
Aarhus

Din tabelstruktur er usaedvanlig og ikke optimal (det vender jeg tilbage til.)  Jeg tror ikke (eller jeg ved ikke hvordan) du kan "explode" i mysql, og SELECT DISTINCT og ORDER BY vil ikke hjaelpe i den tabelstruktur.  Du skal nok goere det i php som du er begyndt paa.  Et problem med din php kode er at du bliver ved med at overskrive din $by-array.  Det foelgende er ikke testet (jeg staar og skal afsted,) men ideen maa vaere at efter hver $row hvor du har fyldt $by[] med bynavne maa du merge de bynavne med bynavnene fra de andre $row's.  For eksempel declare en $allebyer[] og saa bryge array_merge() saaledes:

while($row = mysqli_fetch_array($result_by)
{
    $by[] = explode (",", $row['byerne']);
    array_merge($allebyer, $by)
}

Naar du saa har alle byerne i $allebyer[] kan du sortere vaerdierne ved sort($allebyer) og saa lave en ny array uden duplikater med $uniquebyer = array_unique($allebyer).  $uniquebyer bruger du saa til at bygge din <select> med foreach($uniquebyer as $g
{echo......}.  Som sagt ikke tested.

Men hvorfor laver du ikke en simplere, saakaldt normaliseret tabelstruktur?  Saa ville du direkte kunne soege dine byer uden duplikater (DISTINCT) i raekkefoelge (ORDER BY(..))

Lav en saerskildt tabel med bynavne, for eksempel saaledes:

BY
ID navn
1  Bogense
2  Hjoerring
3  Koebenhavn
3  Odense
5  Skagen
6  Aabenraa
7  Aarhus
8  Doellefjaellemusse

Og saa en tabel hvor du gemmer i hvilke byer der er noget1 (saasom svoemmehaller) og i hvilke der er noget2 (saa som galopbaner) saaledes:

BELIGGENHED
ID noget bynummer
1  "noget1" 7
2  "noget1" 3
3  "noget1" 1
4  "noget1" 5
5  "noget2" 2
6  "noget2" 6
o.s.v.

Saa kunne du faa dit resultat med denne kode:

echo '<select name="by" id="by">;
$query_by = "SELECT DISTINCT navn FROM BY ORDER BY navn";
$result_by = mysqli_query(XXX, $query_by);
while($row = mysqli_fetch_array($result_by))
{
    echo '<option value="' . $row['navn'] . '">' . $row['navn'] . '</option>\n';

Efter at have skrevet indlaegget ser jeg at andre medlemmer i mellemtiden har lavet nogle af de samme kommentarer.  Her kommer det alligevel.
Avatar billede hrole Mester
16. juni 2010 - 21:32 #7
Tak for din grundige gennemgang Christian_Belgien. Jeg har benyttet dit forslag. Smid svar!
16. juni 2010 - 22:39 #8
Her er mit svar.

(Af nysgerrighed, hvilken vej er du gaaet, php eller ny sql-struktur?)
Avatar billede hrole Mester
17. juni 2010 - 09:08 #9
I første omgang har jeg valgt php-vejen, men jeg kan godt se tabelstrukturen ikke er optimal, så jeg går og overvejer hvordan jeg endeligt skal bygge tabellen.
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