[PHP] Groeperen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Mathieuh
  • Registratie: September 2008
  • Laatst online: 26-09-2023
Hallo allemaal,

Ik heb een probleempje dat ik graag wil oplossen. Ik heb gezocht op google maar ik kan het niet vinden, dat komt waarschijnlijk ook omdat ik niet goed weet waar ik op moet zoeken want ik heb werkelijk geen flauw idee hoe ik het op moet lossen.

Ik heb 2 tabellen in mysql:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
productgroep
id   naam
1    groep 1
2    groep 2
3    groep 3

producten
id nummer  groep   omschrijving     prijs
1   511       1          omschrijving 1  2.00
2   512       1          omschrijving 2  5.00
3   513       2          omschrijving 3  4.00
4   514       2          omschrijving 4  9.00
5   515       3          omschrijving 5  3.00
5   516       1          omschrijving 6  13.00   <<<<!!!!!


Nu wil ik het volgende uit de database halen:
ik wil dat alle producten uit groep 1 bij elkaar komen te staan met daarboven de tekst: groep 1 (die moet dus uit de tabel productgroep, veld: naam komen)

Het volgende idee:

Groep 1
511 omschrijving 1 € 2.00
512 omschrijving 2 € 5.00
516 omschrijving 6 € 13.00

Groep 2
513 omschrijving 3 € 4.00
514 omschrijving 4 € 9.00

Groep 3
515 omschrijving 5 € 3.00

-----------
Ik denk dat ik iets met de join functie moet doen maar ik weet niet hoe :+

Er moeten natuurlijk later ook nog groepen en producten kunnen worden toegevoegd, aangepast en worden verwijderd dus de volgorde waarin de producten in de database staan is ook nog eens anders steeds.

Graag jullie ideeën hoe ik dit op moet lossen.
Alvast bedankt!

Acties:
  • 0 Henk 'm!

  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

Over je resultaatset (laten we zeggen $resultset) heen loopen (die geordend op productgroup.id, productennummer) en dan checken of:
1. $resultset[$index - 1][productgroup.id] bestaat, zo nee dan is het je eerste resultaat en moet je een groep title laten zien
2. De huidige anders is dan de vorige ($resultset[$index - 1][productgroup.id] != $resultset[$index][productgroup.id], zo ja dan ook een nieuwe groep titel laten zien.

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


Acties:
  • 0 Henk 'm!

  • Mathieuh
  • Registratie: September 2008
  • Laatst online: 26-09-2023
Cavorka schreef op zaterdag 21 maart 2009 @ 13:42:
Over je resultaatset (laten we zeggen $resultset) heen loopen (die geordend op productgroup.id, productennummer) en dan checken of:
1. $resultset[$index - 1][productgroup.id] bestaat, zo nee dan is het je eerste resultaat en moet je een groep title laten zien
2. De huidige anders is dan de vorige ($resultset[$index - 1][productgroup.id] != $resultset[$index][productgroup.id], zo ja dan ook een nieuwe groep titel laten zien.
Hoe zou ik dat moeten realiseren dan? ik snap namelijk niet wat je precies bedoelt met de resultatenset
edit:
Ik ben al ietsjes verder nu :P :
ik heb de query:
PHP:
1
2
3
4
5
$query = "SELECT g.naam, p.nummer, p.omschrijving, p.prijs FROM productgroep g LEFT JOIN producten p ON g.id = p.groep ORDER BY p.nummer";
        $result = mysql_query($query) or die("MySQL Error: ".mysql_error());
            while($rij = mysql_fetch_assoc($result)) {
            
            }


maar nu weet ik niet hoe ik het precies moet laten zien zegmaar. ik weet wel van $rij['omschrijving'] en zo maar niet hoe ik het moet laten zien zoals ik het wil zien ( 1 maal de groepsnaam en daaronder dan alle producten uit die groep en dan weer 1 maal een andere groepsnaam met die producten etc)

[ Voor 33% gewijzigd door Mathieuh op 21-03-2009 13:58 ]


Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Laatst online: 20:37
Gebruik associatieve arrays. Onderstaande is een voorbeeldje hoe het het ongeveer zou kunnen doen, en hoe je er ook een OO structuur aan kunt geven.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Groep {
private $producten = array();

public function addProduct(Product $product) { 
  $this->producten[$product->getId()] = $product; 
}
}

class Product() {

}

$groepen = array();
// loop door je rijen van de groepen tabel heen
while($row = /* haal rij uit database*/) {
  $groepen[$row["id"]] = new Groep($row);
}
// loop door je rijen van de producten tabel heen
while($row = /* haal rij uit database*/) {
  $groepen[$row["groep"]]->addProduct(new Product($row));
}

Acties:
  • 0 Henk 'm!

Verwijderd

@robbert: het lijkt me dat die "OO structuur" hier niet echt meerwaarde heeft.

Zoiets zou toch wel moeten gaan werken...
PHP:
1
2
3
4
5
6
7
8
9
10
11
$query = 'SELECT g.naam groep_naam, p.* FROM productgroep g LEFT JOIN producten p ON g.id = p.groep ORDER BY p.groep ASC, p.nummer;';
$result = mysql_query($query);
$huidige_groep = '';
while ($row = mysql_fetch_assoc($result))
{
     if ($huidige_groep != $row['groep_naam'])
     {
          echo '<strong>'.$row['groep_naam'].'</strong><br />';
     }
     echo $row['nummer'].' '.$row['omschrijving'].' '.$row['prijs'].'<br />';
}


Misschien beetje offtopic, maar om terug te komen op het OO van hierboven, ik heb wel eens iets wat hier op lijkt gebruikt:
PHP:
1
2
3
4
5
6
7
8
9
foreach (new cGroepList() as $cGroep)
{
     echo '<strong>'.$cGroep->naam.'</strong><br />';
     
     foreach (new cProductList($cGroep->id) as $cProduct)
     {
          echo $cProduct->nummer.' '.$cProduct->omschrijving.' '.$cProduct->prijs.'<br />';
     }
}

In dit geval totaal niet nodig.. ;)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

@robbert: Die dubbele loop die je daar doet kan waarschijnlijk gewoon in één query. Verder wordt er niet naar een OO-opzet gevraagd, dus dat lijkt me alleen verwarrend voor iemand die nog moeite heeft met het concept joins en het zinnig weergeven daarvan. ;)

Mathieuh, de query die je hebt lijkt me redelijk in orde, mits je tenminste ook groepen wil ophalen zonder producten. Als je dat niet wil, dan kun je beter een "gewone" inner join gebruiken. Verder is het niet meer dan dit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$groups = array();
$query = mysql_query(/* jouw query */);
while ($row = mysql_fetch_assoc($query))
{
  $groups[$row['name']][] = $row;
}

foreach ($groups as $groupname => $products)
{
  echo "<h2>$groupname</h2>";
  foreach ($products as $p)
  {
    //de rest van je velden afdrukken
  }
}

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Mathieuh
  • Registratie: September 2008
  • Laatst online: 26-09-2023
Bedankt voor jullie hulp allemaal. het is mij gelukt ;)
Pagina: 1