PHP Array output
Wat ik tot hiertoe heb.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$sql = "SELECT DISTINCT CatId, SubcatId0, SubcatId1, SUbcatId2,Omschrijving,Omschrijving0,Omschrijving1,Omschrijving2
FROM Artikelen_Categorie,Artikelen_Subcategorie0,Artikelen_Subcategorie1,Artikelen_Subcategorie2 ORDER BY Omschrijving DESC";
$result = $con->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_array()) {
$hoofdcat = [
$row["CatId"] =>
$row["Omschrijving"]
];
foreach ($hoofdcat1 as $k => $v ) {
echo " <option Id=".$k." value=".$k.">".$v."</option>";
}
}
$con->close();
}
FROM Artikelen_Categorie,Artikelen_Subcategorie0,Artikelen_Subcategorie1,Artikelen_Subcategorie2 ORDER BY Omschrijving DESC";
$result = $con->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_array()) {
$hoofdcat = [
$row["CatId"] =>
$row["Omschrijving"]
];
foreach ($hoofdcat1 as $k => $v ) {
echo " <option Id=".$k." value=".$k.">".$v."</option>";
}
}
$con->close();
}
Wat ik wil verwezenlijken is een option selectbox (meerdere) maar beginnen met 1 waarbij de output van mijn query ook als Unique word getoond per selectbox.
autos
-<volvo>
-<bmw>
kleur
-<wit>
-<rood>
enz.
Ik kan de output niet uniek krijgen met array_unique waardoor ik een lange lijst krijg.
Tevens kan ik de foreach niet gebruiken buiten de while loop. Hoe kan ik dat het beste oplossen?
Gewijzigd op 03/02/2019 14:57:59 door Bart Smulders
Euh, staat die afsluitende accolade van de while niet op de verkeerde plaats?
Thomas van den Heuvel op 02/02/2019 23:43:20:
Euh, staat die afsluitende accolade van de while niet op de verkeerde plaats?
De accolade verplaatsen was de eerste stap. Vervolgens heb ik binnen men while loop alle gegevens. Het probleem is echter wanneer ik deze gegevens buiten men while loop wil gaan gebruiken toont hij me het eerste record.
Hoe gebruik je het buiten je while?
- Ariën - op 03/02/2019 16:18:40:
Hoe gebruik je het buiten je while?
Letterlijk zo
Code (php)
Waarbij ik veronderstel dat de while loop alle gegevens als array in $hoofdcat heeft geduwd.
Echter wanneer ik dat doe krijg ik slechts 1 item te zien.
Nee, elke stap van de loop overschrijf je $hoofdcat. Dus hij toont overigens niet het eerste record, maar het laatste record :).
Thomas van den Heuvel op 03/02/2019 16:28:43:
Daar vreesde ik al voor.
Hoe kan ik deze array vullen met de nodige gegevens uit de DB en gebruiken ergens anders op dezelfde pagina ?
Zoals $hoofdcat[].
Volgens mij bedoel je dat?
- Ariën - op 03/02/2019 16:51:44:
Maak van $hoofdcat een array?
Zoals $hoofdcat[].
Volgens mij bedoel je dat?
Zoals $hoofdcat[].
Volgens mij bedoel je dat?
Als ik $hoofdcat[] gebruik op deze manier krijg ik als output array, array enz
Laatste aanpassing
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$sql = "SELECT DISTINCT CatId, SubcatId0, SubcatId1, SUbcatId2,Omschrijving,Omschrijving0,Omschrijving1,Omschrijving2
FROM Artikelen_Categorie,Artikelen_Subcategorie0,Artikelen_Subcategorie1,Artikelen_Subcategorie2 ORDER BY Omschrijving DESC";
$result = $con->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_array()) {
$hoofdcat[]= [
$row["CatId"] =>
$row["Omschrijving"]
];
}
foreach ($hoofdcat as $k => $v ) {
echo " <option Id=".$k." value=".$k.">".$v."</option>";
}
$con->close();
}
?>
$sql = "SELECT DISTINCT CatId, SubcatId0, SubcatId1, SUbcatId2,Omschrijving,Omschrijving0,Omschrijving1,Omschrijving2
FROM Artikelen_Categorie,Artikelen_Subcategorie0,Artikelen_Subcategorie1,Artikelen_Subcategorie2 ORDER BY Omschrijving DESC";
$result = $con->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_array()) {
$hoofdcat[]= [
$row["CatId"] =>
$row["Omschrijving"]
];
}
foreach ($hoofdcat as $k => $v ) {
echo " <option Id=".$k." value=".$k.">".$v."</option>";
}
$con->close();
}
?>
Klopt, want die moet je dan nog uitlezen.
- Ariën - op 03/02/2019 17:15:11:
Klopt, want die moet je dan nog uitlezen.
Voor het uitlezen van de array heb ik deze code.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
foreach ($hoofdcat as $ka => $va ) {
foreach($va as $k =>$v ){
echo " <option Id=".$k." value=".$k.">".$v."</option>";
}
}
foreach($va as $k =>$v ){
echo " <option Id=".$k." value=".$k.">".$v."</option>";
}
}
Helaas geeft deze mij de resultaten niet weer zoals het zou moeten. Blijkbaar herhaalt hij zijn lus ergens in een lus waardoor ik deze output krijg:
A
A
A
A
A
A
B
B
B
B
B
C
C
C
C
Met deze nieuwe constructie zitten er dus arrays in het $hoofdcat array. Je zult hier dus nog een foreach lus omheen moeten breien:
Code (php)
EDIT: als dit niet het gewenste resultaat oplevert dan loont het de moeite om je query wat nader te bestuderen. En/of een wat uitgebreidere indeling van $hoofdcat als je dit voor meerdere zaken gebruikt, of je haalt enkel 1 hoofdcategorie op middels je query, tis maar net wat je wilt.
Gewijzigd op 03/02/2019 18:00:35 door Thomas van den Heuvel
Thomas van den Heuvel op 03/02/2019 17:57:12:
Het helpt als je je code netjes inspringt. Dit verbetert de leesbaarheid. En dan zie je ook direct dat dingen mogelijk op de verkeerde plaats staan. Zo sluit je alleen de connectie als er een queryresultaat was. Hoe snijdt dat precies hout? Na afloop van het script / overige PHP-code wordt de connectie sowieso impliciet gesloten, dus het is helemaal niet nodig om dit expliciet te doen. If anything, geef het resultaat van je query vrij als je hiermee klaar bent.
Met deze nieuwe constructie zitten er dus arrays in het $hoofdcat array. Je zult hier dus nog een foreach lus omheen moeten breien:
EDIT: als dit niet het gewenste resultaat oplevert dan loont het de moeite om je query wat nader te bestuderen. En/of een wat uitgebreidere indeling van $hoofdcat als je dit voor meerdere zaken gebruikt, of je haalt enkel 1 hoofdcategorie op middels je query, tis maar net wat je wilt.
Met deze nieuwe constructie zitten er dus arrays in het $hoofdcat array. Je zult hier dus nog een foreach lus omheen moeten breien:
Code (php)
EDIT: als dit niet het gewenste resultaat oplevert dan loont het de moeite om je query wat nader te bestuderen. En/of een wat uitgebreidere indeling van $hoofdcat als je dit voor meerdere zaken gebruikt, of je haalt enkel 1 hoofdcategorie op middels je query, tis maar net wat je wilt.
Je hebt gelijk van dat inspringen. Alhoewel dat reeds meerdere dagen broeden op dit probleem ook niet echt helpt om het dan nog netjes te houden.
Vervolgens heb ik deze aanpassing getest maar heeft hetzelfde resultaat.
Hij geeft na de query 29 resultaten, die dan nog op unique moeten gesorteerd worden naar de 3 dat het moeten zijn. Vandaar dat ik nog goed snap hoe het komt dat deze waarden zoveel worden vermenigvuldigd.
Toevoeging op 03/02/2019 18:44:09:
Thomas van den Heuvel op 03/02/2019 17:57:12:
Het helpt als je je code netjes inspringt. Dit verbetert de leesbaarheid. En dan zie je ook direct dat dingen mogelijk op de verkeerde plaats staan. Zo sluit je alleen de connectie als er een queryresultaat was. Hoe snijdt dat precies hout? Na afloop van het script / overige PHP-code wordt de connectie sowieso impliciet gesloten, dus het is helemaal niet nodig om dit expliciet te doen. If anything, geef het resultaat van je query vrij als je hiermee klaar bent.
Met deze nieuwe constructie zitten er dus arrays in het $hoofdcat array. Je zult hier dus nog een foreach lus omheen moeten breien:
EDIT: als dit niet het gewenste resultaat oplevert dan loont het de moeite om je query wat nader te bestuderen. En/of een wat uitgebreidere indeling van $hoofdcat als je dit voor meerdere zaken gebruikt, of je haalt enkel 1 hoofdcategorie op middels je query, tis maar net wat je wilt.
Met deze nieuwe constructie zitten er dus arrays in het $hoofdcat array. Je zult hier dus nog een foreach lus omheen moeten breien:
Code (php)
EDIT: als dit niet het gewenste resultaat oplevert dan loont het de moeite om je query wat nader te bestuderen. En/of een wat uitgebreidere indeling van $hoofdcat als je dit voor meerdere zaken gebruikt, of je haalt enkel 1 hoofdcategorie op middels je query, tis maar net wat je wilt.
Ik heb de query bekeken en deze levert mij idd geen 29 maar 600 resultaten weer als gevolg van de samentrekking van de rijen over de verschillende tabellen .
Misschien kan ik dit oplossen met een multiquery . Ik heb nog nergens gelezen of deze een beperkt aantal aan query's kan uitvoeren noch hoe ze deftig te gebruiken.
Eigenlijk is het altijd een goed idee om voorzichtig om te gaan met queries. Met een loop in een loop worden het er steeds meer.
De organisatie in je tabel is niet echt fantastisch.
Het lijkt erop dat je een soort van boomstructuur wilt opzetten? Of wellicht meerdere bomen in deze tabel wilt opslaan en apart wilt kunnen uitlezen?
Ook weet ik niet of een dropdown de beste manier is om een boom te representeren. Of stop je subcategorieën van een bepaald niveau in een aparte dropdown?
Anyhow, je kunt altijd volstaan met één query om alles op te halen. Vervolgens verplaats je het sorteerprobleem naar PHP, hier bouw je dan met behulp van een recursieve (zichzelf aanroepende) functie een datastructuur (een genest array) in PHP.
Maar hoe deze er uitziet hangt natuurlijk af van wat je probeert te bereiken, wat mij tot op heden niet bepaald duidelijk is, oftewel, wat wil je hiermee uiteindelijk kunnen bouwen / doen?
Misschien zou je ook kunnen denken aan een andere indeling van je tabellen? Je hebt het over automerken en kleuren. Een kleur is niet echt een subcategorie van een merk. Je moet dan waarschijnlijk meer denken in eigenschappen en waarden. Een bepaald type/serie auto omvat dan een collectie van eigenschappen in een concrete uitvoering, maar dit heeft verder niets weg van een boomstructuur.
Misschien dat je van grof naar fijn wilt in een soort van facetted search ofzo, maar simpelweg omdat iets het uiterlijk van een boomstructuur heeft wil dat niet per se zeggen dat je het ook op die manier zou moeten organiseren in je database.
Gewijzigd op 03/02/2019 23:25:41 door Thomas van den Heuvel
Ik herinner me net dat ik daar ook tegen aan loop in een overzicht op mijns ite. Nu heb ik dus een zes categorieën die ik uit de database ophaal met while. En in die while haal ik alle 10 laatste nieuwsberichten uit die categorie op. Toch 6 queries teveel.... (hoewel Smarty toch enigzins wat bespaart met caching)
Toch ben ik benieuwd naar een opzetje hoe recursie hierin verwerkt kan worden.
1. Haal alle (relevante) categorieën op, gesorteerd op diepte en rangorde van dat niveau (als je dit bijhoudt)
2. bouw bij het ophalen van deze informatie de datastructuur in PHP
Dit concept heb ik al meerdere keren beschreven.
Vervolgens zou je ook een "lineaire lijst" uit deze datastructuur kunnen halen waarbij je zelf het startpunt (de "root") van de boom aangeeft. Deze kun je dan gebruiken om een equivalente boom in HTML te bouwen, bijvoorbeeld een bulleted list ofzo.
Gewijzigd op 04/02/2019 16:42:33 door Thomas van den Heuvel
Het voorbeeld van de auto's was een fictief voorbeeld. Niet iedereen hier heeft voor deze materie een studie genoten en veel moeten we leren van input (waarvoor dank) .
Aan mij database structuur is overigens niets mis. De query zal beter kunnen geen twijfel.
Zodra ik de nieuwe query heb geïmplementeerd en getest ga ik deze hier posten. Mocht er nog meer verbeterwerk aan zijn dan zie ik het wel.
@Arien,
Misschien dat met deze post ook jou probleem verholpen kan.
Mijn tabel structuur is als volgt:
Tabel Artikelen_Categorie
Rijen
CatId , OmschrijvingNL
Tabel Artikelen_Subcategorie0
SubcatId0, Omschrijving0NL
Tabel Artikelen_Subcategorie1
SubcatId1, Omschrijving1NL
Ik moet mijn query dus opbouw zodat ik uit elke tabel de distinct waarden krijg met grouconcat(distinct ....
Dat is wat ik nu ga doen.
Dat is niet bepaald genormaliseerd ;-)
- Ariën - op 04/02/2019 19:57:16:
Oef, categorieën als tabellen nummeren.
Dat is niet bepaald genormaliseerd ;-)
Dat is niet bepaald genormaliseerd ;-)
Ik tracht nochtans echt men best te doen in deze...
Nergens heb ik een veld dat 2keer word beschreven.
waarbij de eerste hoofdcat bv de automatisatie is
waarbij de 2e cat slagbomen zijn
enz
Telkens de juiste taal als vertaling nodig zou zijn , uitbreidbaar voor talen...
Vertel me gerust hoe het wel moet dan.
Gewijzigd op 04/02/2019 20:44:27 door - Ariën -