[PHP] Prev en Next elementen uit een array halen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dit is best wel basic geloof ik, maar ik heb helaas nog niks relevants kunnen vinden...
(http://gathering.tweakers.net/forum/list_messages/392831///php%2Cprev%2Cnext)

Ik heb de volgende array:
PHP:
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
array(6) {
  [1]=>
  object(stdClass)(2) {
    ["title"]=>
    string(4) "Home"
    ["children"]=>
    bool(false)
  }
  [2]=>
  object(stdClass)(2) {
    ["title"]=>
    string(5) "Opzet"
    ["children"]=>
    bool(false)
  }
  [3]=>
  object(stdClass)(2) {
    ["title"]=>
    string(14) "Wedstrijd Data"
    ["children"]=>
    bool(false)
  }
  [8]=>
  object(stdClass)(2) {
    ["title"]=>
    string(10) "Resultaten"
    ["children"]=>
    bool(false)
  }
  [7]=>
  object(stdClass)(2) {
    ["title"]=>
    string(7) "Meedoen"
    ["children"]=>
    bool(false)
  }
  [6]=>
  object(stdClass)(2) {
    ["title"]=>
    string(8) "Adressen"
    ["children"]=>
    bool(false)
  }
}


Zoals je ziet is elke key de id van de pagina in de database, omdat er soms pagina's weg zullen gaan en nieuwe bij zullen komen kan ik niet simpelweg de id verminderen en/of ophogen.
Ik moet dus afhankelijk van de pagina waarop de bezoeker is detecteren (uit de array) wat het vorige en het volgende element is, t.o.v. het element dat de huidige pagina vertegenwoordigt.

Ik heb zitten klooien met de array functies current(), prev() en next(), maar het lukt me niet om een oplossing te vinden...

Als iemand me een beetje op weg kan helpen hiermee, graag! (Die koppijn van vandaag helpt ook niet erg met helder na proberen te denken)

Alvast bedankt!

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

reset($array);

while ( $current = each($array) )
{
    if ( key($array) == 8 )
    {
        $prev = prev($array);
        next($array);
        $next = next($array);
    }
}

?>

Zoiets? Geen idee of het nog beter kan dus mensen: verbeteren maar :)

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor het lapje code!

Oh en wat ook belangrijk is trouwens, ik heb de key van de prev() en next() elementen nodig... (dus de id van deze pagina's)

Ik heb nu de volgende methode:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    function parse_nav_links()
    {
        $out = '';
        if (count($this->menuitems) > 0) {
            $prev = false;
            $next = false;
            reset($this->menuitems);
            while ($current = each($this->menuitems)) {
                if ( key($current) == $this->page->get_id() ) {
                    $prev = prev($this->menuitems);
                    next($this->menuitems);
                    $next = next($this->menuitems);
                }
            }
            if ($prev) {
                $out .= '<link rel="prev" href="./'. $this->config->mainpage .'?pid='. $prev .'">'."\n";
            }
            if ($next) {
                $out .= '<link rel="next" href="./'. $this->config->mainpage .'?pid='. $next .'">'."\n";
            }
        }
        return $out;
    }

[ Voor 146% gewijzigd door Verwijderd op 19-02-2005 18:55 ]


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

reset($array);

while ( $current = each($array) )
{
    if ( key($array) == 8 )
    {
        $prev = prev($array);
        $prev_key = key($array);
        next($array);
        $next = next($array);
        $next_key = key($array);
    }
}

?>

:Y)

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
In een normale array zou dat werken, maar ik heb een Object als array value. De key() functie werkt zo dus niet...

Acties:
  • 0 Henk 'm!

  • pjotrk
  • Registratie: Mei 2004
  • Laatst online: 15-07 18:43
Of er nou een string, een integer of een object in de array zit zou voor de keys niets uit mogen maken:

PHP:
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
<?
function newObject($title, $children)
{
  $object = new stdClass();
  $object->title = $title;
  $object->children = $children;
  return $object;
}

$pages = array (
  1=>newObject("Home", false),
  2=>newObject("Opzet", false),
  3=>newObject("Wedstrijd Data", false), 
  8=>newObject("Resultaten", false), 
  7=>newObject("Meedoen", false), 
  6=>newObject("Adressen", false) 
);

echo "<pre>";
echo var_dump($pages);
echo "</pre>";


$curPage = 8;

function gotoCurrent(&$pagesResult, $current)
{
    reset($pagesResult);
    while ($current != key($pagesResult)) next($pagesResult);
}

function getNextPage($pagesResult, $current)
{
    gotoCurrent(&$pagesResult, $current);
    next($pagesResult);
    return key($pagesResult);
}

function getPrevPage($pagesResult, $current)
{
    gotoCurrent(&$pagesResult, $current);
    prev($pagesResult);
    return key($pagesResult);
}

echo "Current: " . $curPage . "<br>";
echo "Next: " . getNextPage($pages, $curPage) . "<br>";
echo "Prev: " . getPrevPage($pages, $curPage);
?>

Werkt gewoon :)
PHP:
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
    function parse_nav_links() 
    { 
        $out = ''; 
        if (count($this->menuitems) > 0) { 
            $prev = false; 
            $next = false;
            
            // zoek huidige page
            reset($this->menuitems); 
            while (key($this->menuitems) != $this->page->get_id()) next($this->menuitems);

            // haal prev en next op
            if ( key($this->menuitems) == $this->page->get_id()) {
                prev($this->menuitems);
                $prev = key($this->menuitems);
                next($this->menuitems); 
                next($this->menuitems);
                $next = key($this->menuitems);
            } 

            if ($prev) {
                $out .= '<link rel="prev" href="./'. $this->config->mainpage .'?pid='. $prev .'">'."\n";
            } 
            if ($next) { 
                $out .= '<link rel="next" href="./'. $this->config->mainpage .'?pid='. $next .'">'."\n"; 
            } 
        }
      
        return $out; 
    }

Zou dus ook moeten werken denk ik.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor de hulp!

Als ik de eerste of de laatste pagina klikte dan pakte ie of de prev() óf de next() niet lekker, dus ik heb de code als volgt aangepast:
PHP:
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
    function parse_nav_links()
    {
        $out = '';
        $len = count($this->menuitems);
        if ($len > 0) {
            $prev = false;
            $next = false;
            $i = 0;
            reset($this->menuitems);
            // get current page (id)
            while (key($this->menuitems) != $this->page->get_id()) { next($this->menuitems); $i++; }

            // get previous and next pages (id)
            if (key($this->menuitems) == $this->page->get_id()) {
                if ($i > 0) {
                    prev($this->menuitems);
                    $prev = key($this->menuitems);
                    next($this->menuitems); 
                }
                next($this->menuitems);
                if ($i < $len) {
                    $next = key($this->menuitems);
                }
            }
            if ($prev) {
                $out .= '<link rel="prev" href="./'. $this->config->mainpage .'?pid='. $prev .'" title="'. $this->menuitems[$prev]->title .'">'."\n";
            }
            if ($next) {
                if ($prev) { $out .= '    '; }
                $out .= '<link rel="next" href="./'. $this->config->mainpage .'?pid='. $next .'" title="'. $this->menuitems[$next]->title .'">'."\n";
            }
        }
        return $out;
    }

[ Voor 16% gewijzigd door Verwijderd op 20-02-2005 05:36 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De while()-statement was niet echt optimaal, als de opgevraagde id niet bestond in de array dan bleef de while()-loop oneindig doorgaan. Ik heb de functie als volgt veranderd:

PHP:
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
    function parse_nav_links()
    {
        $out = '';
        $len = count($this->menuitems);
        if ($len > 0) {
            $prev = false;
            $next = false;
            $i = 0;
            // get current (parent) page (id)
            if ($this->page->get_parent_id()) {
                $parent_id = $this->page->get_parent_id();
            } else {
                $parent_id = $this->page->get_id();
            }
            // set array pointer to current page (id)
            reset($this->menuitems);
            while ($i < $len) {
                if (key($this->menuitems) == $parent_id) {
                    break;
                } else {
                    next($this->menuitems);
                    $i++;
                }
            }

            // get previous and next pages (id)
            if (key($this->menuitems) == $parent_id) {
                if ($i > 0) {
                    prev($this->menuitems);
                    $prev = key($this->menuitems);
                    next($this->menuitems); 
                }
                next($this->menuitems);
                if ($i < $len) {
                    $next = key($this->menuitems);
                }
            }
            if ($prev) {
                $out .= '<link rel="prev" href="./'. $this->config->mainpage .'?pid='. $prev .'" title="'.
                        htmlspecialchars($this->menuitems[$prev]->title) .'">'."\n";
            }
            if ($next) {
                if ($prev) { $out .= '    '; }
                $out .= '<link rel="next" href="./'. $this->config->mainpage .'?pid='. $next .'" title="'.
                        htmlspecialchars($this->menuitems[$next]->title) .'">'."\n";
            }
        }
        return $out;
    }

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Optimaal? Ik heb hem nog een beetje getweaked, nog niet getest overigens:
PHP:
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
<?

function parse_nav_links()
{
    if ( count($this->menuitems) == 0 ) return "";
    
    $parent_id = $this->page->get_parent_id() ? $this->page->get_parent_id() : $this->page->get_id();
    
    if ( !in_array($parent_id, array_keys($this->menuitems)) ) return "";
    
    reset($this->menuitems);
    
    while ( each($this->menuitems) )
    {
        if ( key($this->menuitems) != $parent_id ) continue;
        
        $prefix = '';
        $out = '';
        
        if ( $prev = prev($this->menuitems) )
        {
            $out = '
                <link
                    rel="prev"
                    href="./'. $this->config->mainpage .'?pid='. key($this->menuitems) .'"
                    title="'. htmlspecialchars($prev->title) .'">
            ';
            
            next($this->menuitems);
            
            $prefix = '      ';
        }
        
        if ( $next = next($this->menuitems) )
        {
            $out .= $prefix . '
                <link
                    rel="next"
                    href="./'. $this->config->mainpage .'?pid='. key($this->menuitems) .'"
                    title="'. htmlspecialchars($next->title) .'">
            ';
        }
        
        return $out;
    }
}

?>

edit:

en nog een klein beetje :P

[ Voor 53% gewijzigd door Michali op 22-02-2005 11:10 ]

Noushka's Magnificent Dream | Unity

Pagina: 1