Wie ooo Wie kan mij helpen?


Waar ik naar opzoek ben is om de categorieën en de bijhorende producten uit de database te krijgen.

Onderstaand een voorbeeld van de database
Het betreft 3 tabellen category, products en relation

Categorieën (category)
[table]
[tr][td]id[/td][td]category[/td][/tr]
[tr][td]1[/td][td]Speelgoed[/td][/tr]
[tr][td]2[/td][td]Boeken[/td][/tr]
[tr][td]3[/td][td]Gereedschap[/td][/tr]
[tr][td]4[/td][td]Kantoorartikelen[/td][/tr]
[/table]

Producten (product)
[table]
[tr][td]id[/td][td]products[/td][/tr]
[tr][td]1[/td][td]Hamer[/td][/tr]
[tr][td]2[/td][td]Zaag[/td][/tr]
[tr][td]3[/td][td]Schroevendraaier[/td][/tr]
[tr][td]4[/td][td]Beitel[/td][/tr]
[tr][td]5[/td][td]Papier[/td][/tr]
[/table]

Koppeltabel (relation)
[table]
[tr][td]proid[/td][td]catid[/td][/tr]
[tr][td]3[/td][td]1[/td][/tr]
[tr][td]3[/td][td]2[/td][/tr]
[tr][td]3[/td][td]3[/td][/tr]
[tr][td]3[/td][td]4[/td][/tr]
[tr][td]4[/td][td]5[/td][/tr]
[/table]

Wat is nu een manier om dit eenvoudig te presenteren?

Gereedschap
- Hamer
- Zaag
- Schroevendraaien
- Beiten

Kantoorartikelen
- Papier

<?php
$output = array(
	1 => array(
		'name' => 'Speelgoed',
		'description' => 'In deze category zie je allemaal speelgoed',
		'products' => array(
			1 => array(
            	'productname' => 'Lego',
               	'price' => '12,95',
			),
		),	
	),
	2 => array(
		'name' => 'Speelgoed',
		'description' => 'In deze category zie je allemaal speelgoed',
		'products' => array(
			2 => array(
            	'productname' => 'Puzzel 1000 stukjes',
               	'price' => '19,95',
			),
		),	
	),
	3 => array(
		'name' => 'Huishouden',
		'description' => 'In deze category vind je alles voor het huishouden',
		'products' => array(
			1 => array(
            	'productname' => 'swiffer',
               	'price' => '12,95',
			),
		),	
	),
	4 => array(
		'name' => 'Huishouden',
		'description' => 'In deze category vind je alles voor het huishouden',
		'products' => array(
			2 => array(
            	'productname' => 'Stofzuiger',
               	'price' => '12,95',
			),
		),	
	),
);
	
foreach($output as $categoryId => $category){
	echo '<h1>'.$category['name'].'</h1>';
	echo '<div>'.$category['description'].'</div></br>';
	foreach($category['products'] as $productId => $product){
		echo '<div>'.$product['productname'].'</div></br>';
		echo '<div>'.$product['price'].'</div></br>';
	}
}
?>


OK dit werkt tot zover maar nu zit ik nog met één probleem:
De categorienaam en de beschrijving mogen maar een keer vertoont worden, zoals het nu werkt worden deze bij elk product getoond.
Maar dan zou je niet allemaal aparte categorieën moeten maken voor eenzelfde categorie?

Ik zou dus eerder het volgende verwachten:
<?php
$output = array(
    1 => array(
        'name' => 'Speelgoed',
        'description' => 'In deze category zie je allemaal speelgoed',
        'products' => array(
            1 => array(
                'productname' => 'Lego',
                   'price' => '12,95',
            ),
            2 => array(
                'productname' => 'Puzzel 1000 stukjes',
                   'price' => '19,95',
            ),
        ),    
    ),
    3 => array(
        'name' => 'Huishouden',
        'description' => 'In deze category vind je alles voor het huishouden',
        'products' => array(
            1 => array(
                'productname' => 'swiffer',
                   'price' => '12,95',
            ),
            2 => array(
                'productname' => 'Stofzuiger',
                   'price' => '12,95',
            ),
        ),    
    ),
);
?>
Yes Thomas,


Dit werkt inderdaad :-).

Ik heb de array nu hardcode gemaakt om te checken of het werkte, maar kan ik zo een array nu ook genereren uit mijn mysql resultaten?
Uiteraard, een alternatief is on-the-fly bepalen of er een nieuwe categorie gestart is, dan hoef je niet twee keer een loop uit te voeren (een voor het bouwen van het array tijdens het uitlezen van de resultaten en een voor het doorlopen van dit array), maar kun je in 1x door de resultaten.

Bijvoorbeeld als volgt:
<?php
$currentCategoryId = false;

while ($row = mysqli_fetch_assoc($result)) {
    if ($row['catid'] != $currentCategoryId) {
        // we zijn van categorie veranderd, dus geef hier een nieuw categorie kopje weer
        // ...
        // onthoud de nieuwe categorie
        $currentCategoryId = $row['catid'];
    }
    // geef hier de productinformatie weer
    // ...
}
?>

Reageren