div einde toevoegen nadata alle elementen per category er in staan

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Bart Smulders

Bart Smulders

26/04/2020 18:25:40
Quote Anchor link
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.

categorie 1
<div>
<ul>
<li>item1</<li>
</ul>
</div>

categorie 2
<div>
<ul>
<li>item1</<li>
</ul>
</div>

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php
$result
= $con->query($sql);

if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        $rows[]=$row;
        
    }
}


$con->close();


if($rows==true){
$sorted = array();
$test = array();
$count = 0;
$cat= array();
    
foreach ($rows as $v) {
   if(!array_key_exists($v['Categorie_NL'], $sorted )) {
      
      $sorted[$v["Categorie_NL"]] = array();
echo'
<button class="collapsible">'
.$v["Categorie_NL"].' </button>
<div class="content"><ul>
'
;
      
 }

    
$sorted[$v["Categorie_NL"]][] = $v["Aid"]; sort($sorted[$v['Categorie_NL']]);
    
echo"<li> ".$v["Artikel_ID"]."</li>\r\n" ;
    
    $cat[]=$v["Categorie_NL"];    
    $verder= next($cat);
    $huidig= current($cat);
    
if(!empty($verder) && $huidig != $verder){
    echo"</ul></div>";
    }
    
 }

ksort($sorted);
}

else
{
        echo"Er werden geen documenten weerhouden" ;    
    }

?>
Gewijzigd op 26/04/2020 20:03:56 door Bart Smulders
 
PHP hulp

PHP hulp

27/11/2020 12:34:20
 
- Ariën -
Beheerder

- Ariën -

26/04/2020 18:53:02
Quote Anchor link
Hoe komt het er nu uit?
 
Bart Smulders

Bart Smulders

26/04/2020 18:59:52
Quote Anchor link
Nu komt het er als volgt uit zonder dat de div en ul word afgesloten.

<button class="collapsible active">Buitenposten </button>
<div class="content" style="max-height: 90px;"><ul>
<li> JPDV</li><li> JPDVF</li>

<button class="collapsible active">Voedingen </button>
<div class="content" style="max-height: 138px;"><ul>
<li> PS2420DM</li><li> JPDVFL</li>
<li> GTD</li>
<li> BIS1</li>
<li> BIE1</li>

<button class="collapsible">Binnenposten </button>
<div class="content"><ul>
<li> JP4HD</li><li> MCWSA</li>

<button class="collapsible">Toegangscontrole </button>
<div class="content"><ul>
<li> AC10S</li>

<button class="collapsible">Toebehoren </button>
<div class="content"><ul>
<li> JPWBA</li>
<li> JP8Z</li>
<li> KJKF</li>
<li> MGF30</li>

<button class="collapsible">Bel &amp; relais </button>
<div class="content"><ul>
<li> RY3DL</li>
<li> IER2</li>
<li> TAR4</li>
<li> CSJMDVFL</li>

<button class="collapsible">Interface </button>
<div class="content"><ul>
<li> JPTLI</li>
<li> JPTLIIPA</li>
 
Adoptive Solution

Adoptive Solution

26/04/2020 19:08:04
Quote Anchor link
Volgens mij heb je gesjoemeld met de code.

Vanaf regel 34 stond er eerst :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
echo"<li> ".$v["Artikel_ID"]."</li>" ;
$cat[]=$v["Categorie_NL"];    
$verder= next($cat);
$huidig= current($cat);
if(!empty($verder) && $huidig != $verder){
    echo"</ul></div>";
}


Als aan de IF wordt voldaan worden de UL en DIV afgesloten.

Hier de code die er eerst stond :

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
$result
= $con->query($sql);

if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        $rows[]=$row;
        
    }
}

else {
    $hint="";
}

$con->close();
if ($hint=="") {
}
else {
  echo $hint;
}

if($rows==true){
$sorted = array();
$test = array();
$count = 0;
$cat= array();
foreach ($rows as $v) {
   if(!array_key_exists($v['Categorie_NL'], $sorted )) {
      $sorted[$v["Categorie_NL"]] = array();
echo'
<button class="collapsible">'
.$v["Categorie_NL"].' </button>
<div class="content"><ul>
'
;  
 }

   $sorted[$v["Categorie_NL"]][] = $v["Aid"];
   sort($sorted[$v['Categorie_NL']]);
echo"<li> ".$v["Artikel_ID"]."</li>" ;
$cat[]=$v["Categorie_NL"];    
$verder= next($cat);
$huidig= current($cat);
if(!empty($verder) && $huidig != $verder){
    echo"</ul></div>";
}
 }

ksort($sorted);
}

else
{
        echo"Er werd niets weerhouden" ;    
    }

?>
Gewijzigd op 26/04/2020 19:08:41 door Adoptive Solution
 
- Ariën -
Beheerder

- Ariën -

26/04/2020 19:18:55
Quote Anchor link
Gooi er meteen wat tabs in, want het is echt niet echt lekker leesbaar zo.
 
Adoptive Solution

Adoptive Solution

26/04/2020 19:26:31
Quote Anchor link
Het origineel met tabs

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?php
$result
= $con->query($sql);

if ($result->num_rows > 0)
{

    // output data of each row
    while( $row = $result->fetch_assoc() )
    {

        $rows[]=$row;
    }
}
else {
    $hint="";
}

$con->close();
if ( $hint == "" )
{
}
else {
    echo $hint;
}

if( $rows == true )
{

    $sorted = array();
    $test = array();
    $count = 0;
    $cat= array();
    foreach ( $rows as $v )
    {

        if( !array_key_exists($v['Categorie_NL'], $sorted ) )
        {

            $sorted[$v["Categorie_NL"]] = array();
            echo '<button class="collapsible">'.$v["Categorie_NL"].' </button>
            <div class="content"><ul>'
;
        }

        $sorted[$v["Categorie_NL"]][] = $v["Aid"];
        sort($sorted[$v['Categorie_NL']]);
        echo "<li> " . $v["Artikel_ID"] . "</li>";

// vanaf hier ontbreekt het in het aangepaste bericht
        $cat[]=$v["Categorie_NL"];
        $verder= next($cat);
        $huidig= current($cat);
        if( !empty( $verder ) && $huidig != $verder )
        {

            echo "</ul></div>";
        }

// tot hier ontbreekt het

    }
    ksort($sorted);

}
else {
    echo"Er werd niets weerhouden" ;
}

?>


Als de UL en DIV niet worden getoond, voldoet de IF niet in
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
if( !empty( $verder ) && $huidig != $verder )
Gewijzigd op 26/04/2020 19:27:21 door Adoptive Solution
 
Bart Smulders

Bart Smulders

26/04/2020 20:16:03
Quote Anchor link
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.


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
$cat[]=$v["Categorie_NL"];
        $verder= next($cat);
        $huidig= current($cat);
        if( !empty( $verder ) && $huidig != $verder )
        {
            echo "</ul></div>";
        }
 
Thomas van den Heuvel

Thomas van den Heuvel

26/04/2020 22:22:09
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?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.
Gewijzigd op 26/04/2020 23:40:46 door Thomas van den Heuvel
 
Bart Smulders

Bart Smulders

27/04/2020 22:25:54
Quote Anchor link
Beste Thomas,

Dank voor jou input, echter:
1-> Er is geen controle meer of de categorie nu al dan niet reeds getoond werd of niet.

En krijg ik nu het volgende resultaat wat ik wel verwacht had.
A
A
A
B
B
B
C
C
C
C
D
D
D

Hoe zou jij het normaal doen?

Alvast bedankt voor jou antwoord.
 
Thomas van den Heuvel

Thomas van den Heuvel

28/04/2020 00:07:28
Quote Anchor link
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:
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
<?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.
 
Bart Smulders

Bart Smulders

28/04/2020 22:06:35
Quote Anchor link
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.


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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?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>";
}
        


?>


Onderwerp gesloten.
 



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.