[PHP] Lijst sorteren met kopjes per onderdeel

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Rexomnium
  • Registratie: September 2000
  • Laatst online: 17-09 16:07

Rexomnium

Vincam aut moriar

Topicstarter
Ik heb een lijstje met verschillende items. Deze items hebben de volgende indeling in mySQL:
ID# - Persoon - Bericht - Categorie

Deze lijst sorteer ik met behulp van:
PHP:
1
$sql = "SELECT * FROM lijst ORDER BY categorie ASC";


Ik krijg dus nu een lijst met alle items, gesorteerd op categorie. Nu wil ik per categorie een kopje hebben in de HTML.

Ik wil dus, heel eenvoudig, een lijst krijgen die er ongeveer zo uit ziet:
Categorie grappig
Persoon en bericht
Persoon en bericht
Persoon en bericht
Persoon en bericht

Categorie Leuk
Persoon en bericht
Persoon en bericht
Persoon en bericht
Persoon en bericht

Categorie Anders
Persoon en bericht
Persoon en bericht
Persoon en bericht
Persoon en bericht

Hoe krijg ik dat voor elkaar? Moet ik verschillende queries daarvoor uitvoeren? Zoiets als:
PHP:
1
2
3
$sql = "SELECT * FROM lijst WHERE categorie='Grappig' ORDER BY categorie ASC";
$sql2 = "SELECT * FROM lijst WHERE categorie='Leuk' ORDER BY categorie ASC";
$sql3 = "SELECT * FROM lijst WHERE categorie='Anders' ORDER BY categorie ASC";

... of is er een makkelijkere methode? Ik ben niet zo heel ervaren met PHP en ik heb net mijn eerste schreden gezet. Ik heb heel even een helpende hand nodig :)

[ Voor 4% gewijzigd door Rexomnium op 19-09-2004 14:03 ]

We zijn allemaal vaandeldrager in een optocht van gekwetsten.


Acties:
  • 0 Henk 'm!

Verwijderd

Ja dat is de enige methode.
Bij elke query dus apart ook mysql_query() gebruiken en mysql_fetch_assoc(), je kunt dit niet ineen proppen...

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

Het kan o.a. op deze manier:
PHP:
1
2
3
4
5
6
7
8
9
10
//alles zwaar versimpeld, maar genoeg om de structuur te snappen
  //jouw query van bovenaan gebruiken
$previous = -1;
while(mysql_fetch_array(...)) 
{
   //gegevens in normale variabelen zetten

   if ($previous == -1 || $previous == $categorie) echo "kopje $categorie";
   echo "$persoon en $bericht";
}


edit:
ikke lekker eersie :P.
Doe alsjeblieft niet wat carlos zegt: stel je voor dat je syteem groeit, je hebt ineens 200 categorieën, en je krijgt een parse error! Die methode is niet acceptabel qua onderhoud. Altijd daaraan denken, dat heb ik inmiddels wel geleerd (o.a. op school, maar ook op stage en met mijn eigen projectjes)

[ Voor 40% gewijzigd door MBV op 19-09-2004 14:24 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Je kunt in de loop checken of de categorie veranderd en dan een kopje echoen.

Acties:
  • 0 Henk 'm!

Verwijderd

Deze vraag komt ook behoorlijk regelmatig terug, dus de search kan je ook helpen.

Maar het idee is dat je door alle elementen heenloopt, en het kopje wegschrijft als het anders is dan die van het vorige element.

Bijv:

PHP:
1
2
3
4
5
6
7
8
9
10
11
$res = mysql_query($sql);
$lastcat = "";
while ($row = mysql_fetch_assoc($res)) {

  // Schrijf categorieheader als hij anders is dan de vorige
  if ($row["categorie"] != $lastcat) echo "<h3>$row[categorie]</h3>";
  $lastcat = $row["categorie"];

  // En schrijf element hier weg
  echo "$row[persoon]: $row[bericht]";
}

Acties:
  • 0 Henk 'm!

  • aardbeix15
  • Registratie: Maart 2001
  • Niet online

aardbeix15

100%fruit pers je er niet uit!

zoals MBV zegt, hier kan je eenvoudig een loopje voor maken door te kijken of de huidge categorie anders is dan de voorgaande, je kan dan beslissen of je hem wilt printen of niet.

edit: spuit 11

[ Voor 8% gewijzigd door aardbeix15 op 19-09-2004 14:21 ]

snel zeggen: 'De koetsier poetst de postkoets met postkoetspoets'
levensmotto: 'vroeg gedaan is lang gerelaxed!'.


Acties:
  • 0 Henk 'm!

Verwijderd

De genoemde methoden (na mijn post zeg maar) kunnen, maar dan kun je niet per categorie sorteren. Als dat niet nodig is, kun je die methoden natuurlijk gewoon gebruiken.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 19 september 2004 @ 14:19:
Deze vraag komt ook behoorlijk regelmatig terug, dus de search kan je ook helpen.

Maar het idee is dat je door alle elementen heenloopt, en het kopje wegschrijft als het anders is dan die van het vorige element.

Bijv:

PHP:
1
2
3
4
5
6
7
8
9
10
11
$res = mysql_query($sql);
$lastcat = "";
while ($row = mysql_fetch_assoc($res)) {

  // Schrijf categorieheader als hij anders is dan de vorige
  if ($row["categorie"] != $lastcat) echo "<h3>$row[categorie]</h3>";
  $lastcat = $row["categorie"];

  // En schrijf element hier weg
  echo "$row[persoon]: $row[bericht]";
}
strings en variabelen door elkaar gooien op de manier zoals jij dat doet is niet iets wat je een beginnend phper wil leren. Ook moeten keys van arrays met een single quote genoteerd worden. Zo lijkt me het beter:

PHP:
1
2
3
4
5
6
7
8
9
10
11
$res = mysql_query($sql);
$lastcat = "";
while ($row = mysql_fetch_assoc($res)) {

  // Schrijf categorieheader als hij anders is dan de vorige
  if ($row['categorie'] != $lastcat) echo "<h3>" . $row['categorie'] . "</h3>";
  $lastcat = $row['categorie'];

  // En schrijf element hier weg
  echo $row['persoon'] . ": " . $row['bericht'];
}

[ Voor 18% gewijzigd door Verwijderd op 19-09-2004 15:26 ]


Acties:
  • 0 Henk 'm!

Verwijderd

MBV schreef op 19 september 2004 @ 14:19:

edit:
ikke lekker eersie :P.
Doe alsjeblieft niet wat carlos zegt: stel je voor dat je syteem groeit, je hebt ineens 200 categorieën, en je krijgt een parse error! Die methode is niet acceptabel qua onderhoud. Altijd daaraan denken, dat heb ik inmiddels wel geleerd (o.a. op school, maar ook op stage en met mijn eigen projectjes)
Hmz,

het ligt er gewoon aan hoe je systeem eruit ziet. Als je inderdaad de mogelijkheid hebt in het systeem om categorieën aan te maken, en dit dus explosief kan groeien, dan is dat niet verstandig. Anders (als het 3 of 4 categorieën zijn) is dat geen enkel probleem. Het kan idd ook op de andere manieren, maar volgens mij alleen als je niet ook wilt kunnen sorteren per categorie. Omdat in de openingspost 3 vb querys neergezet waren met sortering (order by), dacht ik dat het de bedoeling van de ts is om per categorie te kunnen sorteren. Wellicht is dat niet zo...

Acties:
  • 0 Henk 'm!

  • KompjoeFriek
  • Registratie: Maart 2001
  • Laatst online: 15-08 22:46

KompjoeFriek

Statsidioot

MBV, ook jou manier is niet dynamisch genoeg. bij jou is het vereist dat de records op de goede volgorde staan. Staan ze niet op volgorde, dan krijg je bij jou methode dubbele categorieën te zien ;)

Dus, waarom ben ik hier het woord DISTINCT nog niet tegen gekomen?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$query = mysql_query("SELECT DISTINCT categorie FROM lijst");
while ($object = mysql_fetch_object($query))
{
  echo "<b>".$object->categorie.":</b><br />";
  $query2 = mysql_query("SELECT * FROM lijst
                         WHERE categorie='".$object->categorie);
  while ($object2 = mysql_fetch_object($query2))
  {
    echo $object2->persoon.": ".$object2->bericht."<br />";
  }
  echo "<br />";
}

WhatPulse! - Rosetta@Home - Docking@Home


Acties:
  • 0 Henk 'm!

Verwijderd

KompjoeFriek schreef op 19 september 2004 @ 14:50:
MBV, ook jou manier is niet dynamisch genoeg. bij jou is het vereist dat de records op de goede volgorde staan. Staan ze niet op volgorde, dan krijg je bij jou methode dubbele categorieën te zien ;)
Ze staan op volgorde omdat er wordt gesorteerd op categorie.
Dus, waarom ben ik hier het woord DISTINCT nog niet tegen gekomen?
[...]
Ja, lekker veel queries gaan gebruiken. Nee dat is een hele verbetering. :z

Doe dit nu maar gewoon met een enkele query, en laat PHP lekker de rest opknappen.

Acties:
  • 0 Henk 'm!

  • console
  • Registratie: September 2002
  • Laatst online: 21:26
Verwijderd schreef op 19 september 2004 @ 14:24:
De genoemde methoden (na mijn post zeg maar) kunnen, maar dan kun je niet per categorie sorteren. Als dat niet nodig is, kun je die methoden natuurlijk gewoon gebruiken.
Je kan het ook met 2 tabelletjes te doen bv;

code:
1
2
3
4
5
6
7
8
9
[Categories]
Categorie_ID
Categorie_Title

[Messages]
Message_ID
Message_Categorie_ID
Message_Person
Message_Person_Message


En voor de output.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    /* First sql qeury */
    $cat = mysql("test_db", "SELECT Categorie_ID, Categorie_Title FROM categories ORDER BY Categorie_ID ASC");
    if(!mysql_num_rows($cat)) {

        echo "Er zijn geen categorieen!";

    } else {

        while($cat_r = mysql_fetch_array($cat)) {
         
            echo "<br>+ <strong>".$cat_r['Categorie_Title']."</strong>";

                 /* Second sql qeury */
                    $msg = mysql("test_db", "SELECT Message_Categorie_ID, Message_Person, Message_Person_Message 
FROM messages WHERE Message_Categorie_ID=".$cat_r['Categorie_ID']." ORDER BY Message_ID ASC");
                        if(!mysql_num_rows($msg)) {

                                echo "<br> - Er zijn geen berichten in deze categorie!";

                        } else {

                                while($msg_r = mysql_fetch_array($msg)) {
         
                                             echo "<br> - ".$msg_r['Message_Person']." : ".$msg_r['Message_Person_Message'];

                                }
                         }
        }
    }

[ Voor 9% gewijzigd door console op 19-09-2004 14:57 ]


Acties:
  • 0 Henk 'm!

  • --MeAngry--
  • Registratie: September 2002
  • Laatst online: 19-09 16:35

--MeAngry--

aka Qonstrukt

Verwijderd schreef op 19 september 2004 @ 14:31:
[...]

Hmz,

het ligt er gewoon aan hoe je systeem eruit ziet. Als je inderdaad de mogelijkheid hebt in het systeem om categorieën aan te maken, en dit dus explosief kan groeien, dan is dat niet verstandig. Anders (als het 3 of 4 categorieën zijn) is dat geen enkel probleem. Het kan idd ook op de andere manieren, maar volgens mij alleen als je niet ook wilt kunnen sorteren per categorie. Omdat in de openingspost 3 vb querys neergezet waren met sortering (order by), dacht ik dat het de bedoeling van de ts is om per categorie te kunnen sorteren. Wellicht is dat niet zo...
Ik gebruik zelf ook de methode die MBV nu noemt en als je gewoon goed gebruik maakt van ORDER is alles prima te sorteren hoor. (ORDER BY categorie,naam bijvoorbeeld)

Tesla Model Y RWD (2024)


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 19 september 2004 @ 14:24:
De genoemde methoden (na mijn post zeg maar) kunnen, maar dan kun je niet per categorie sorteren. Als dat niet nodig is, kun je die methoden natuurlijk gewoon gebruiken.
Tuurlijk wel. Dan geef je gewoon een tweede sorteersleutel op:

code:
1
SORT BY categorie, persoon

Acties:
  • 0 Henk 'm!

  • Anders
  • Registratie: December 2000
  • Laatst online: 13-09 18:52
Verwijderd schreef op 19 september 2004 @ 14:26:
Ook moeten keys van arrays met een single quote genoteerd worden.
???

Dan zou ik PHP.net maar even een mailtje sturen, kunnen ze hun halve manual herschrijven.

Ik spoor veilig of ik spoor niet.


Acties:
  • 0 Henk 'm!

Verwijderd

Anders schreef op 19 september 2004 @ 20:41:
[...]


???

Dan zou ik PHP.net maar even een mailtje sturen, kunnen ze hun halve manual herschrijven.
offtopic:
deze manual?
You should always use quotes around a string literal array index.
For example, use $foo['bar'] and not $foo[bar]. But why is $foo[bar] wrong? You might.. etc.

Acties:
  • 0 Henk 'm!

  • blizt
  • Registratie: Januari 2003
  • Laatst online: 11-12-2024

blizt

Wannabe-geek

Verwijderd schreef op 19 september 2004 @ 14:26:
strings en variabelen door elkaar gooien op de manier zoals jij dat doet is niet iets wat je een beginnend phper wil leren. Ook moeten keys van arrays met een single quote genoteerd worden.
En gewone strings hoeft dat niet bij? Misschien eens het verschil leren tussen dubbele en single quotes?

En ik denk dat "anders" meer sommige voorbeelden in de manual bedoelde (heb er nu even geen bij de hand, maar ze doen het best vaak "fout")....

United we stand, and divided we fall


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 19 september 2004 @ 21:42:
[...]


offtopic:
deze manual?
You should always use quotes around a string literal array index.
For example, use $foo['bar'] and not $foo[bar]. But why is $foo[bar] wrong? You might.. etc.
Van precies dezelfde pagina:

PHP:
1
2
3
echo $arr["somearray"][6];    // 5
echo $arr["somearray"][13];  // 9
echo $arr["somearray"]["a"];  // 42


Verder ging het stukje dat je daar aanhaalt niet over een discussie tussen enkele of dubbele quotes, maar tussen wel een geen quotes. En dat quotes daar horen, dat mag ondertussen duidelijk zijn.

De conclusie die ik hieruit trek is dat deze paragrafen door verschillende personen zijn geschreven, met verschillende syntax stijlen. Ik neem het als een kwestie van smaak, en ga lekker door met mijn manier. Als andere mensen hun quotes anders neerzetten is dat natuurlijk ook oké, maar ga er alsjeblieft geen heilige oorlogen over voeren...

[ Voor 17% gewijzigd door Verwijderd op 19-09-2004 22:29 ]


Acties:
  • 0 Henk 'm!

  • flashin
  • Registratie: Augustus 2002
  • Laatst online: 17-12-2023
je zou het natuurlijk ook moeilijk kunnen doen met arrays :p. Dat je met multidimensionale arrays werkt en iedere categorie een nieuwe array geeft zeg maar. Zoiets heb ik eerder gebruikt om iets op datum te sorteren..

maar in jou geval kan het gewoon met 1 query en een van de eerste oplossingen..

Verwijderd

Verwijderd schreef op 19 september 2004 @ 22:28:

Van precies dezelfde pagina:

PHP:
1
2
3
echo $arr["somearray"][6];    // 5
echo $arr["somearray"][13];  // 9
echo $arr["somearray"]["a"];  // 42
offtopic:
Dit is ook allemaal correcte php. Als het gaat om een integer die tussen de teksthaken van de array staat (dus een nummerieke array), dan moet deze geen quotes krijgen. Als het gaat om een associatieve array, zoals $arr["somearray"]["a"]; dan moet je wel quotes gebruiken.
Verwijderd schreef op 19 september 2004 @ 22:28:
De conclusie die ik hieruit trek is dat deze paragrafen door verschillende personen zijn geschreven, met verschillende syntax stijlen. Ik neem het als een kwestie van smaak, en ga lekker door met mijn manier. Als andere mensen hun quotes anders neerzetten is dat natuurlijk ook oké, maar ga er alsjeblieft geen heilige oorlogen over voeren...
offtopic:
Heilige oorlogen ben ik ook tegen. Wat ik wel vaak op php.net zie, is dubbele quotes, en dan in de string ook variabelen gebruiken. Veel mensen op diverse fora vinden dit ook vreselijk. (dus echo "hoi $naam, hoe is het ermee"; ipv echo "hoi ".$naam.", hoe is het ermee"; ) Dat vind ik een kwestie van style.

Maar bij de arrays is het meer dan een kwestie van style, want het is gewoon fout om $array[blaat] te noteren. Controleerbaar? Ja! test maar eens uit om een element uit een associatieve array te echo-en, terwijl bovenaan je script
error_reporting(E_ALL); staat. Je krijgt dan iets van 'undefined constant blaat assument 'blaat' te zien als notice.

Kortom: zo inconsequent is php.net ook weer niet.

Moest toch even reageren, ondanks het feit dat het niet direct met het onderwerp van de TS te maken heeft... Vandaar in offtopic haken...

[ Voor 14% gewijzigd door Verwijderd op 22-09-2004 01:59 ]

Pagina: 1