For-loop afkappen en doorlopen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Dennis Mertens

Dennis Mertens

11/12/2008 15:42:00
Quote Anchor link
Een hele goede middag.

Ik ben bezig met een pagina nummering voor reacties.

Op het moment dat het aantal pagina's meer is dan 11 wordt het een chaos. Daarom wil ik er een structuur in maken.

Wanneer er dus meer pagina's zijn dan 11, moet het volgende worden weergegeven:

In dit voorbeeld heb ik in totaal 15 pagina's

Als ik op de 1ste pagina ben
1 2 3 || 13 14 15

Als ik op de 3de pagina ben
1 2 3 4 || 13 14 15

Als ik op de 6de pagina ben
1 2 3 || 5 6 7 || 13 14 15

Als ik op de 7de pagina ben
1 2 3 || 6 7 8 || 13 14 15

Als ik op de 10de pagina ben
1 2 3 || 9 10 11 || 13 14 15
Als ik op de 11de pagina ben
1 2 3 || 10 11 12 13 14 15

Ik ben al met van alles bezig geweest. Krijg er geen logica in :(
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<?php

$aCharacters
= Range(1, 120);

$iTotalCharacters = Count($aCharacters);

$iCurrent = IsSet($_GET['p']) ? $_GET['p'] : 1;
$bg = 1;
$iIf = 0;
For($iPage = 1; $iPage <= $iTotalCharacters; $iPage++)
{

    echo ' <a href="c.php?p='.$iPage.'">'.$iPage.'</a> ';
    If($iTotalCharacters > 11)
    {

        If($iCurrent >= 6 && $iPage == 3)
        {

            echo '||1||';
            $iPage = $iCurrent - 2;
            $iIf = 1;
        }

        
        If($iIf == 1)
        {

            If($iCurrent <= $iTotalCharacters - 5)
            {

                If($iCurrent == $iTotalCharacters - 5)
                {

                    echo '||2||';
                    $iPage = $iTotalCharacters - 3;
                    $iIf = 'end';
                }
            }
        }

        
        /*If($iCurrent <= 7)
        {
            If($iPage >= 3 && $iCurrent >= 6)
            {
                echo '||1||';
                $iPage = $iTotalCharacters - 3;
            }
        }
        Else
        {
            If($iCurrent < $iTotalCharacters - 3 && $iPage > $iTotalCharacters - 2)
            {
                echo '||2||';
                $iPage = $iTotalCharacters - 2;
            }
            ElseIf($iCurrent > 5 && $iPage < $iTotalCharacters - 3)
            {
                echo 'STOP';
                $iPage = $iTotalCharacters;
            }
        }*/
        /*
        If($iCurrent > 5 && $iCurrent < $iTotalCharacters - 2)
        {
            If($iPage == 3)
            {
                echo '||1||';
                $iPage = $iCurrent - 2;
            }
            ElseIf($iCurrent == $iTotalCharacters - 2)
            {
                echo '||2||';
                $iPage = $iTotalCharacters - 1;
            }
            ElseIf($iPage == $iCurrent + 1)
            {
                echo '||3||';
                $iPage = $iTotalCharacters - 3;
            }
        }
        ElseIf($iCurrent <= 6)
        {
            If($iPage == 6)
            {
                $iPage = $iTotalCharacters - 3;
            }
        }*/

    }
    
    $bg++;
    if($bg == $iTotalCharacters)
    {

        $iPage = $iTotalCharacters;
    }
}


?>


Van alles al geprobeerd.

Iemand een idee?

M.v.g.
Dennis Mertens
 
PHP hulp

PHP hulp

24/12/2024 15:04:57
 
Yorick17

yorick17

11/12/2008 16:21:00
Quote Anchor link
ik weet wel hoe je gewoon 1|2|3|4 enz..
misschien heb ja daar wat aan?
 
Dennis Mertens

Dennis Mertens

11/12/2008 16:23:00
Quote Anchor link
Hmmz dat kan ik ook wel. Het gaat mij erom dat als er 100 zijn het erg lelijk wordt.

Hier ben ik nu mee bezig:
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

$aCharacters
= Range(1, 120);

$iTotalCharacters = Count($aCharacters);

$iCurrent = IsSet($_GET['p']) ? $_GET['p'] : 1;
$bg = 1;
$iIf = 0;
For($iPage = 1; $iPage <= $iTotalCharacters; $iPage++)
{

    echo ' <a href="c.php?p='.$iPage.'">'.$iPage.'</a> ';
    If($iTotalCharacters > 11)
    {
        
        If($iCurrent > 5 && $iCurrent < $iTotalCharacters - 2)
        {

            If($iPage == 3)
            {

                echo '||1||';
                $iPage = $iCurrent - 2;
            }

            ElseIf($iCurrent == $iTotalCharacters - 2)
            {

                echo '||2||';
                $iPage = $iTotalCharacters - 1;
            }

            ElseIf($iPage == $iCurrent + 1)
            {

                echo '||3||';
                $iPage = $iTotalCharacters - 3;
            }
        }

        ElseIf($iCurrent <= 6)
        {

            If($iPage == 6)
            {

                echo '||5||';
                $iPage = $iTotalCharacters - 3;
            }

            ElseIf($iCurrent >= 3 && $iPage == $iCurrent + 1)
            {

                echo '||4||';
                $iPage = $iTotalCharacters - 3;
            }
        }
    }

    
    $bg++;
    if($bg == $iTotalCharacters)
    {

        $iPage = $iTotalCharacters;
    }
}

?>


Voorbeeld wat ik heb:

Totaal pagina's: 120
Huidige pagina: 35

1 2 3 || 34 35 36 || 118 119 120

Als ik op 116 ben:
1 2 3 ||1|| 115 116 117 ||3|| 118 119 120
Als ik op 117 ben:
1 2 3 ||1|| 116 117 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||3|| 118 ||


Ik weet opzich waar het aan ligt. iPage omhoog zetten kan wel. Maar naar beneden komt hij langs vele nog een keer. Dus ik denk dat ik nog een variabele laat mee tellen en dit de huidige wordt ofzo.


Edit
Ik heb het bijna!!!!!!!!!!!

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
55
56
57
58
59
60
61
62
63
64
65
66
<?php

$aCharacters
= Range(1, 120);

$iTotalCharacters = Count($aCharacters);

$iCurrent = IsSet($_GET['p']) ? $_GET['p'] : 1;
$bg = 1;
$iIf = 0;
For($iPage = 1, $iPageEnd = 1; $iPage <= $iTotalCharacters, $iPageEnd <= $iTotalCharacters; $iPage++, $iPageEnd++)
{

    echo ' <a href="c.php?p='.$iPage.'">'.$iPage.'</a> ';
    If($iTotalCharacters > 11)
    {
        
        If($iCurrent > 5)
        {

            If($iPage == 3)
            {

                echo '||1||';
                $iPage = $iCurrent - 2;
                $iPageEnd = $iCurrent - 2;
            }

            ElseIf($iPage > 3 && $iCurrent == $iTotalCharacters - 2 && $iPageEnd == $iPage)
            {

                //$iPage++;
                //$iPageEnd++;

            }
            ElseIf($iCurrent >= $iTotalCharacters - 4 && $iPageEnd >= $iTotalCharacters - 4)
            {
                
            }

            ElseIf($iPage == $iCurrent + 1)
            {

                echo '||3||';
                $iPage = $iTotalCharacters - 3;
                $iPageEnd = $iTotalCharacters - 3;
            }
        }

        ElseIf($iCurrent <= 6)
        {

            If($iPage == 6)
            {

                echo '||5||';
                $iPage = $iTotalCharacters - 3;
                $iPageEnd = $iTotalCharacters - 3;
            }

            ElseIf($iCurrent >= 3 && $iPage == $iCurrent + 1)
            {

                echo '||4||';
                $iPage = $iTotalCharacters - 3;
                $iPageEnd = $iTotalCharacters - 3;
            }
        }

        ElseIf($iCurrent >= $iTotalCharacters - 2)
        {
            
        }
    }

    
    $bg++;
    if($bg == $iTotalCharacters)
    {

        $iPage = $iTotalCharacters;
    }
}

?>


1 probleem!
Wanneer ik op de laatste pagina zit zie ik dit:
1 2 3 ||1|| 119 120

Maar het moet het volgende zijn:
1 2 3 ||1|| 118 119 120

Ik word er knetter geack van gehe :p
Gewijzigd op 01/01/1970 01:00:00 door Dennis Mertens
 
Joren de Wit

Joren de Wit

11/12/2008 16:52:00
Quote Anchor link
Probeer het eens zo:
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
<?php
$iTotal
= 50;
$iCurrent = 10;

for($i = 1; $i <= $iTotal; $i++)
{

    if($i < 3)
    {

        echo $i.' ';
    }

    elseif($i == 3)
    {

        echo $i.' ';
        
        if($iCurrent != 4)
        {

            echo '|| ';
        }
    }

    elseif($i == 4)
    {
        
        if($iCurrent == 4)
        {

            echo $i.' || ';
        }
    }

    elseif($i > 4 && $i < $iTotal - 3)
    {

        if($i >= $iCurrent - 1 && $i <= $iCurrent + 1)
        {

            echo $i.' ';
        }
    }

    elseif($i == $iTotal - 3)
    {

        if($iCurrent < $iTotal - 5)
        {

            echo '|| ';
        }

        else
        {
            echo $i.' ';
        }
    }

    elseif($i > $iTotal - 3)
    {

        echo $i.' ';
    }
}

?>

Wellicht dat er nog wat kleine foutjes in zitten, maar volgens mij doet het grotendeels wat jij wilt...

Wil je meer of minder pagina's zien, dan is het een kwestie van de waarden in de elseif-statements aanpassen.
 
- SanThe -

- SanThe -

11/12/2008 17:12:00
Quote Anchor link
Misschien een beetje ingewikkeld geworden, maar is getest en werkt.
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
55
56
57
58
59
60
61
<?php
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);

$aCharacters = Range(1, 120);
$iTotalCharacters = Count($aCharacters);
$iCurrent = IsSet($_GET['p']) ? $_GET['p'] : 1;

switch (true)
{
    case
$iTotalCharacters < 10:
        for($i=1; $i<=$iTotalCharacters; $i++)
        {

            echo ($i == $iCurrent) ? ' '.$i.' ' : ' <a href="c.php?p='.$i.'">'.$i.'</a> ';
        }

    break;
    case
$iCurrent < 6:
        for($i=1; $i<=6; $i++)
        {

            echo ($i == $iCurrent) ? ' '.$i.' ' : ' <a href="c.php?p='.$i.'">'.$i.'</a> ';
        }

        if($iTotalCharacters > 7)
        {

            echo ' || ';
            for($i=($iTotalCharacters -2); $i<=$iTotalCharacters; $i++)
            {

                if($i <= $iTotalCharacters)
                {

                    echo ($i == $iCurrent) ? ' '.$i.' ' : ' <a href="c.php?p='.$i.'">'.$i.'</a> ';
                }
            }
        }

    break;
    case
$iCurrent > ($iTotalCharacters-5):
        for($i=1; $i<=3; $i++)
        {

            echo ($i == $iCurrent) ? ' '.$i.' ' : ' <a href="c.php?p='.$i.'">'.$i.'</a> ';
        }

        echo ' || ';
        for($i=($iTotalCharacters-5); $i<=$iTotalCharacters; $i++)
        {

            echo ($i == $iCurrent) ? ' '.$i.' ' : ' <a href="c.php?p='.$i.'">'.$i.'</a> ';
        }

    break;
    default:

        for($i=1; $i<=3; $i++)
        {

            echo ($i == $iCurrent) ? ' '.$i.' ' : ' <a href="c.php?p='.$i.'">'.$i.'</a> ';
        }

        echo ' || ';
        for($i=($iCurrent-1); $i<=($iCurrent +1); $i++)
        {

            echo ($i == $iCurrent) ? ' '.$i.' ' : ' <a href="c.php?p='.$i.'">'.$i.'</a> ';
        }

        echo ' || ';
        for($i=($iTotalCharacters-2); $i<=$iTotalCharacters; $i++)
        {

            echo ($i == $iCurrent) ? ' '.$i.' ' : ' <a href="c.php?p='.$i.'">'.$i.'</a> ';
        }
}

?>


Edit: Of iets korter genoteerd:
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
<?php
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);

$aCharacters = Range(1, 120);
$iTotalCharacters = Count($aCharacters);
$iCurrent = IsSet($_GET['p']) ? $_GET['p'] : 1;

function
show($iCurrent, $i)
{

    return ($i == $iCurrent) ? ' '.$i.' ' : ' <a href="c.php?p='.$i.'">'.$i.'</a> ';
}


switch (true)
{
    case
$iTotalCharacters < 10:
        for($i=1; $i<=$iTotalCharacters; $i++) { echo show($iCurrent, $i); }
    break;
    case
$iCurrent < 6:
        for($i=1; $i<=6; $i++) { echo show($iCurrent, $i); }
        if($iTotalCharacters > 7)
        {

            echo ' || ';
            for($i=($iTotalCharacters -2); $i<=$iTotalCharacters; $i++)
            {

                if($i <= $iTotalCharacters) { echo show($iCurrent, $i); }
            }
        }

    break;
    case
$iCurrent > ($iTotalCharacters-5):
        for($i=1; $i<=3; $i++) { echo show($iCurrent, $i); }
        echo ' || ';
        for($i=($iTotalCharacters-5); $i<=$iTotalCharacters; $i++) { echo show($iCurrent, $i); }
    break;
    default:

        for($i=1; $i<=3; $i++) { echo show($iCurrent, $i); }
        echo ' || ';
        for($i=($iCurrent-1); $i<=($iCurrent +1); $i++) { echo show($iCurrent, $i); }
        echo ' || ';
        for($i=($iTotalCharacters-2); $i<=$iTotalCharacters; $i++) { echo show($iCurrent, $i); }
}

?>
Gewijzigd op 01/01/1970 01:00:00 door - SanThe -
 
Joren de Wit

Joren de Wit

11/12/2008 17:36:00
Quote Anchor link
@SanThe: Waarom kies je voor zoveel verschillende loops? Het lijkt mij veel makkelijker om alle pagina's met 1 loop te doorlopen en voor elke pagina te bekijken of hij weergegeven moet worden of niet. A la mijn voorbeeld dus...
 
- SanThe -

- SanThe -

11/12/2008 17:40:00
Quote Anchor link
De loops zijn allen zeer kort. Die van jou loopt een loop van 50. Ik gebruik alléén loops die ik nodig heb er zit geen enkele overbodige in.
 
Marien xD

Marien xD

11/12/2008 17:45:00
Quote Anchor link
Ik heb dit opgelost met een array... Er zijn ontzettend mooie array functies waar je kan kijken of er waardes bestaan enzo. Ik geef een voorbeeld code:

(direct copy-paste uit een class :$)

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
55
56
57
58
59
60
<?php

//calculate available pages
$pages = ceil($totalcount/RESULTS_PER_PAGE);

//current page
if(isset($_GET['p']) && is_numeric($_GET['p']) && $_GET['p'] > 0 && $_GET['p'] <= $pages)
{

    $this->current_page = $_GET['p'];
}

else
{
    /**
     * The requested page is not available
     * Check if the page below the requested page exists
     *
     * This is usefull when we remove the last item from the list while
     * the list item is placed on the last page without records.
     */

    if(isset($_GET['p']) && is_numeric($_GET['p']) && ($_GET['p']-1) == $pages)
    {

        $this->current_page = $pages;
    }
}


/**
 * If we have more than 7 pages generate advanced paging
 */

if($pages > 7)
{

    $page_numbers = array();
    $page_numbers[] = 1;
    
    $above = $this->current_page + 3;
    $above = ($above > $pages-1) ? $pages : $above;
    $above = ($above == ($pages-2)) ? ($pages-2) : $above;
    $under = $this->current_page - 3;
    $under = ($under < 2) ? 2 : $under;
    $under = ($under == 3) ? 2 : $under;

    for($i=$under;$i<$above;$i++)
    {

        $page_numbers[] = $i;
    }

    
    $page_numbers[] = $pages;
}

elseif($pages == 0)
{

    //workaround when we have zero results
    $page_numbers[] = 1;
    $pages = 1;
    $this->current_page = 1;
}

else
{
    //easy paging
    $page_numbers = range(1,$pages);
}

?>


Er zat nog 1 klein bugje in maar dit is het idee.

Aan het eind bevat de array $page_numbers de nummers die je wilt weergeven.

Nu heb ik in mijn template een klein checkje erin zitten of het vorige getal niet meer gelijk is aan huidig getal-1 dan even scheidings tekens zetten.

Nogmaals, dit is geen werkende code maar een voorbeeld :)
 
Dennis Mertens

Dennis Mertens

11/12/2008 18:34:00
Quote Anchor link
Ik ben er ook achter. Kwam er achter toen ik net me computer uit gezet had. Haha.

Ik moest nog 1 if-statement bij ||2|| :) Om te controleren of $iCurrent gelijk is aan $iTotalCharacters.

Ik ga het zo testen. Maar iig thnkz en zal die van jullie ook even door kijken.
 



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.