div einde toevoegen nadata alle elementen per category er in staan
Door
Bart Smulders
op 26-04-2020 18:25
gewijzigd op 26-04-2020 20:03
9.894 views
Ik heb me de kop er al over gebroken hoe dit tot stand te brengen.
Zonder de div te moeten sluiten per categorie werkt het perfect.
Helaas heb ik voor deze toepassing de volgende structuur nodig.
Ik heb inderdaad het gedeelte er uit gesmeten. aangezien het ook niet werkt.
Wanneer ik de volgende vars in echo zet krijg ik:
$verder = leeg
$huidig = leeg
$v["Categorie_NL"]= elke categorie word weer gegeven.
Zo heb ik de indruk dat array $cat[] niet gevuld word en er dus geen volgende of vorige kan zijn.
Waarvoor is al die $rows en $sorted zooi nodig? Je doet drie keer ongeveer hetzelfde? Het enige wat je bij hoeft te houden is of je van categorie schakelt? Dat bepaalt of je wat extra HTML/wrappers weergeeft. Je kunt dus ook terug van twee naar één foreach/while loop? De bovenstaande code kan stukken minder wollig?
De enige reden dat je twee loops zou kunnen rechtvaardigen is als je de applicatielogica en layout verder uit elkaar zou trekken, bijvoorbeeld als je met templates werkt ofzo. Of misschien voor de overzichtelijkheid, maar ik vind de bovenstaande code allesbehalve overzichtelijk.
EDIT nog een alternatief: als je dan toch een loop spendeert aan het in een soort van datastructuur gieten van je data, organiseer dan je data per categorie, en zet daar dan de items onder, zodat je vervolgens dit kunt doen:
<?php
foreach ($myCategoryDataSet as $category) {
// geef hier je categoriespecifieke HTML zut weer
// ...
foreach ($category['items'] as $item) {
// regel hier HTML voor elk categorie-item
// ...
}
// afsluitende HTML zut voor huidige categorie
// ...
}
?>
Als je dan toch arrays aan het bouwen bent, maak hier dan slim gebruik van.
Je kunt in je query al de categorieën en de items daarbinnen sorteren. Deze staan dus al in de goede volgorde als je deze ophaalt uit de database.
Vervolgens kun je ofwel on-the-fly bijhouden of je van categorie geschakeld bent (maar dit levert redelijk wollige code op), of je bouwt eerst een hulparray (datastructuur) waarin je alles gewoon in een categorie-subarray duwt.
Dus zoiets:
<?php
$myCategoryDataSet = array();
$res = $con->query($sql);
while ($row = $res->fetch_assoc()) {
if (empty($myCategoryDataSet[$row['Categorie_NL']])) {
// als dit categorie-array nog niet bestaat, maak deze aan
$myCategoryDataSet[$row['Categorie_NL']] = array(
'items' => array(),
// en wat je hier verder nog op categorie-niveau in wilt zetten
// als je verder geen categorie-specifieke informatie hebt zou
// je het items-subarray achterwege kunnen laten / eruit kunnen slopen
);
}
// nu we er van verzekerd zijn dat het categorie-subarray bestaat kunnen we zonder zorgen items toevoegen
// ik gooi hier simpelweg $row in, maar je zou dit verder zelf uit kunnen werken wat je van $row nodig hebt
$myCategoryDataSet[$row['Categorie_NL']]['items'][] = $row;
}
?>
En vervolgens kun je dit met de code uit mijn vorige reactie uitlezen.
Thomas,
100x dank.
En zoals je zei heb ik eerst de data gesorteerd in de query.
De finale code werd dan. Dit werkt perfect.
Het gebruik van array's blijft een moeilijk thema.
<?php
$result = $con->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while ($row = $result->fetch_assoc()) {
if (empty($myCategoryDataSet[$row['Categorie_NL']])) {
// als dit categorie-array nog niet bestaat, maak deze aan
$myCategoryDataSet[$row['Categorie_NL']] = array(
'items' => array(),
);
}
$myCategoryDataSet[$row['Categorie_NL']]['items'][] = $row;
}
}
else
{
echo"Er werden geen documenten weerhouden" ;
}
$con->close();
foreach ($myCategoryDataSet as $category) {
echo'
<button class="collapsible">'.$category['items'][0]["Categorie_NL"].' </button>
<div class="content"><ul>
';
foreach ($category['items'] as $item) {
echo"<li> ".$item["Artikel_ID"]."</li>\r\n" ;
}
echo"</ul></div>";
}
?>