PHP Array output

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Bart Smulders

Bart Smulders

02/02/2019 22:47:24
Quote Anchor link
Ten einde raad.

Wat ik tot hiertoe heb.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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();
}


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
 
PHP hulp

PHP hulp

24/12/2024 02:03:59
 
Thomas van den Heuvel

Thomas van den Heuvel

02/02/2019 23:43:20
Quote Anchor link
Euh, staat die afsluitende accolade van de while niet op de verkeerde plaats?
 
Bart Smulders

Bart Smulders

03/02/2019 14:56:12
Quote Anchor link
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.
 
- Ariën  -
Beheerder

- Ariën -

03/02/2019 16:18:40
Quote Anchor link
Hoe gebruik je het buiten je while?
 
Bart Smulders

Bart Smulders

03/02/2019 16:22:19
Quote Anchor link
- Ariën - op 03/02/2019 16:18:40:
Hoe gebruik je het buiten je while?

Letterlijk zo
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
    foreach ($hoofdcat as $k => $v ) {    
            
  echo " <option Id=".$k." value=".$k.">".$v."</option>";
            
    
}
    
    ?>


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.
 
Thomas van den Heuvel

Thomas van den Heuvel

03/02/2019 16:28:43
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
$hoofdcat = [
$row["CatId"] =>
$row["Omschrijving"]
];

Nee, elke stap van de loop overschrijf je $hoofdcat. Dus hij toont overigens niet het eerste record, maar het laatste record :).
 
Bart Smulders

Bart Smulders

03/02/2019 16:32:42
Quote Anchor link
Thomas van den Heuvel op 03/02/2019 16:28:43:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
$hoofdcat = [
$row["CatId"] =>
$row["Omschrijving"]
];

Nee, elke stap van de loop overschrijf je $hoofdcat. Dus hij toont overigens niet het eerste record, maar het laatste record :).


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 ?
 
- Ariën  -
Beheerder

- Ariën -

03/02/2019 16:51:44
Quote Anchor link
Maak van $hoofdcat een array?
Zoals $hoofdcat[].

Volgens mij bedoel je dat?
 
Bart Smulders

Bart Smulders

03/02/2019 17:05:46
Quote Anchor link
- Ariën - op 03/02/2019 16:51:44:
Maak van $hoofdcat een array?
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)
PHP script in nieuw venster Selecteer het PHP script
1
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();
}

?>
 
- Ariën  -
Beheerder

- Ariën -

03/02/2019 17:15:11
Quote Anchor link
Klopt, want die moet je dan nog uitlezen.
 
Bart Smulders

Bart Smulders

03/02/2019 17:54:06
Quote Anchor link
- 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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
      foreach ($hoofdcat as $ka => $va ) {
            
            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
 
Thomas van den Heuvel

Thomas van den Heuvel

03/02/2019 17:57:12
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
foreach ($hoofdcat as $row) {
    foreach ($row as $k => $v) {
        // doe je ding...
    }
}

?>

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
 
Bart Smulders

Bart Smulders

03/02/2019 18:09:26
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
foreach ($hoofdcat as $row) {
    foreach ($row as $k => $v) {
        // doe je ding...
    }
}

?>

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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
foreach ($hoofdcat as $row) {
    foreach ($row as $k => $v) {
        // doe je ding...
    }
}

?>

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.
 
- Ariën  -
Beheerder

- Ariën -

03/02/2019 18:52:30
Quote Anchor link
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.
 
Thomas van den Heuvel

Thomas van den Heuvel

03/02/2019 23:21:40
Quote Anchor link
Oh, ik zie denk ik het probleem al.

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
 
- Ariën  -
Beheerder

- Ariën -

04/02/2019 15:10:25
Quote Anchor link
Eigenlijk wel interessant.
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.
 
Thomas van den Heuvel

Thomas van den Heuvel

04/02/2019 16:40:16
Quote Anchor link
Dat is eigenlijk altijd hetzelfde:
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
 
Bart Smulders

Bart Smulders

04/02/2019 19:49:23
Quote Anchor link
@Thomas,
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.
 
- Ariën  -
Beheerder

- Ariën -

04/02/2019 19:57:16
Quote Anchor link
Oef, categorieën als tabellen nummeren.
Dat is niet bepaald genormaliseerd ;-)
 
Bart Smulders

Bart Smulders

04/02/2019 20:04:59
Quote Anchor link
- Ariën - op 04/02/2019 19:57:16:
Oef, categorieën als tabellen nummeren.
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.
 
- Ariën  -
Beheerder

- Ariën -

04/02/2019 20:38:30
Quote Anchor link
Het zijn categorieën, dus die horen in één tabel. Maar je kan voor subcategorieën dan aangeven welke categorieID de 'parent' id is.
Gewijzigd op 04/02/2019 20:44:27 door - Ariën -
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.