[PHP] maximaal aantal items met 'foreach'

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik gebruik een script wat een lijst met fotoalbums uit Flickr 'zuigt'. Nu is het alleen zo dat ik behoorlijk wat albums op Flickr heb staan en zodoende een meterslange lijst krijg.

In het script wat de connectie met Flickr staat worden de sets opgehaald via deze regel:

PHP:
1
foreach (array_keys($sets['photoset']) as $key)


Is het mogelijk om hier een maximaal aantal weer te geven items aan te hangen?

[ Voor 2% gewijzigd door Verwijderd op 24-04-2009 14:31 . Reden: Php code toegevoegd ]


Acties:
  • 0 Henk 'm!

  • mathijs92
  • Registratie: December 2007
  • Laatst online: 16-09 20:34
ik zou dat met een for-loop doen. die zijn er voor gemaakt

Acties:
  • 0 Henk 'm!

  • RAJH
  • Registratie: Augustus 2001
  • Niet online
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$i = 1;
$max = 30;

foreach(array_keys($sets['photoset']) as $key)
{
    if ($i == $max)
    {
        break;
    }

    // Doe iets met de $key

    $i++
}


Je zou ook kunnen kijken naar een for-loop.

Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 17:19
Met matthijs92. Als je niet elk item wilt hebben, waarom gebruik je dan foreach? :P

PHP:
1
2
3
for ($set = array_keys($sets['photoset']); $i <= $max; $key = next($set), $i++) {

}


Hmm, de overzichtelijkheid is ver te zoeken op die manier :X

edit:
En hij 'vergeet' de eerste omdat hij het volgende element teruggeeft. Zinvol. :X


PHP:
1
2
3
for ($set = array_keys($sets['photoset']), $i = 0; $i <= $max; $key = $set[$i], $i++) {
        print $key;
}


Werkt wel omdat array_keys numerieke indexen gebruikt.

[ Voor 83% gewijzigd door Jaap-Jan op 24-04-2009 14:27 ]

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Of gewoon wel foreach en zorgen dat je daarvoor al een gelimiteerd aantal albums ophaalt.

{signature}


Acties:
  • 0 Henk 'm!

  • Apen-nootjes
  • Registratie: September 2001
  • Laatst online: 03-04 12:48

Apen-nootjes

aka Apen-klootjes

met een for lus:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

$key = array_keys($sets['photoset']);

$start = 0; // Begin met ophalen bij record 0

/* 1 van de onderstaande regels gebruiken, niet beide ;) */
$end = count($key); // gebruik deze om alle keys op te halen
$end = 100; // Gebruik deze om er honderd op te halen

for($i=$start; $i<$end; $i++)
{
    print_r($key[$i]);
}

?>


Zoeits in ieder geval, ongetest en zo uit m'n hoofd opgeschreven :P

SmartDoDo: Ach, afhankelijk van je smaak kan het best een lekker geil ding zijn :P
You never had a date you couldn't inflate


Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Je vraagt iets over PHP, dus past je topic beter in Programming

Zie ook: Waar hoort mijn topic?

Ik verplaats daarom even je topic naar de juiste plek :)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
BtM909 schreef op vrijdag 24 april 2009 @ 14:09:
Je vraagt iets over PHP, dus past je topic beter in Programming

Zie ook: Waar hoort mijn topic?

Ik verplaats daarom even je topic naar de juiste plek :)
Excuus, ik dacht dat programming niet zozeer met internet/php te maken had. Prima wanneer hij op deze plek komt te staan. Ik ga kijken naar de bovenstaande suggesties. Ben geen php-held, hopelijk kom ik eruit.

Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Misschien dat een array_slice makkelijker is ( http://nl3.php.net/manual/en/function.array-slice.php )

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • Quadro!
  • Registratie: Maart 2004
  • Laatst online: 19-09 15:53
Waar wordt $sets gedefinieerd? Je zegt dat ze daar opgehaald worden, maar dat kan ik mij bijna niet voorstellen, aangezien je daar over een array in een variabele looped. Die moet dus eerder al gedefinieerd zijn. Nu heb ik geen ervaring met Flickr en PHP, dus correct me if I'm wrong, maar is het niet mogelijk direct in de Flickr API call miner photosets op te halen? :+

Oh ja, je kunt ook gewoon de keys krijgen door het volgende te doen:

PHP:
1
foreach ($sets['photoset'] as $key => $value) { /* */ }

[ Voor 10% gewijzigd door Quadro! op 24-04-2009 14:20 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Misschien is het duidelijker wanneer ik de hele code van het ophalen van de setlijsten (albums) laat zien:

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
        function DisplaySetList($username, $title, $intro)
        {
                // Find the NSID of the username
                $nsid = $this->f->people_findByUsername($username);
                if (!$nsid) {
                        echo "<p>" . $this->Lang('flickrerrorusername', $username) . "</p>\n";
                        return;
                }

                // Get list of photo sets
                $sets = $this->f->photosets_getList($nsid);

                // Slightly alternative way of doing the foreach - this is so that we can obtain
                // a reference to $set and not a copy of $set.
                foreach (array_keys($sets['photoset']) as $key)
                {
                        $set = &$sets['photoset'][$key];
                        $set['url'] = "http://farm4.static.flickr.com/" . $set['server'] . "/" . $set['primary'] . "_" . $set['secret'] . "_s.jpg";
                        $set['middle'] = "http://farm4.static.flickr.com/" . $set['server'] . "/" . $set['primary'] . "_" . $set['secret'] . "_m.jpg";
                        $set['link'] = $this->GetURL($set['id']);
                        $set['description'] = html_entity_decode($set['description']);
                        $set['title'] = html_entity_decode($set['title']);
                }

                // Assign variables to Smarty and process template
                $this->smarty->assign_by_ref('setlist', $sets['photoset']);
                $this->smarty->assign('title', $title);
                $this->smarty->assign('intro', $intro);
 
                echo $this->ProcessTemplate($this->setlist_template);
        }

[ Voor 0% gewijzigd door een moderator op 24-04-2009 14:27 . Reden: Doe het zelf wel ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Misschien is het duidelijker als je je code in [code=php]...[/code] tags zet :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
.oisyn schreef op vrijdag 24 april 2009 @ 14:23:
Misschien is het duidelijker als je je code in [code=php]...[/code] tags zet :)
Handig dat daar geen knop voor is in de opmaakbalk :p

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op vrijdag 24 april 2009 @ 14:25:
[...]


Handig dat daar geen knop voor is in de opmaakbalk :p
We hebben een shitload aan UBB codes; je wil echt niet voor iedere scheet een knop op die balk ;)
code tags

Het was overigens minder moeite geweest even die "=php" er in te knallen voor je dan die zinloze reply te schrijven.

[ Voor 12% gewijzigd door RobIII op 24-04-2009 14:27 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
RobIII schreef op vrijdag 24 april 2009 @ 14:26:
[...]

We hebben een shitload aan UBB codes; je wil echt niet voor iedere scheet een knop op die balk ;)
code tags

Het was overigens minder moeite geweest even die "=php" er in te knallen voor je dan die zinloze reply te schrijven.
Dat dat voor jou/jullie vanzelfsprekend is hoeft nog niet te betekenen dat dit voor anderen ook zo is. Bedankt voor het aangeven in ieder geval. Weer iets geleerd ;)

Acties:
  • 0 Henk 'm!

  • Quadro!
  • Registratie: Maart 2004
  • Laatst online: 19-09 15:53
In dit geval is het inderdaad het handigst om zoals eerder aangegeven door RAJH iets te doen als:

PHP:
1
2
3
4
5
6
7
8
$i = 0;
$i_max = 10; // laat max 10 photosets zien
foreach (/* je foreach statement */) {
    $i++;
    if ($i > $i_max) break;

    /* doe je ding */
}

Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Met forEach en een $max is naar mijn inzicht de beste oplossing. Als je minder items hebt dan max, werkt dit prima. Met een for($x=0;$x<$max) ding moet je ook nog controleren of er nog items zijn.

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dank allen, ik ga ermee aan de slag. De code van Quadro! ga ik proberen te implementeren.

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

nm, volgorde omgedraaid :+

[ Voor 92% gewijzigd door Bosmonster op 24-04-2009 14:47 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Helaas, het werkt niet. De foreach die ik hierboven aangaf is alleen bedoeld voor de thumbnails die geladen moeten worden. Met de php toevoeging erbij laadt 'ie alleen de eerste 10 thumbnails, de andere info (teksten, album title etc.) van de overige albums blijven wél staan.

De flickr module werkt met templates, maar die zijn niet in php opgebouwd maar in html. Het stukje code wat de lijst genereert met flickr-albums is alsvolgt:

HTML:
1
2
3
4
5
6
7
8
<ul class="flickr_setlist">
{foreach from=$setlist item=set}
    <li>
        <a href="{$set.link}"><img alt="{$set.title}" src="{$set.url}" /></a>
        <h2>{$set.title}</h2><div class="klein">({$set.photos} foto's)</div>
    </li>
{/foreach}
</ul>


De php-code met $ = 1; etc. hierin plakken geeft errors omdat het geen php-document is (denk ik). Iemand een suggestie hoe ik het nu aan kan pakken? Het mooiste zou zijn wanneer ik hier, in de template, kan aangeven hoeveel albums ik wil laden. Dan kan ik m'n flickr-module onaangetast laten.

Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Je wilt het dus op template niveau oplossen...

Dat kan toevallig met smarty wel, maar dan moet je section gebruiken in plaats van foreach.

http://smarty.net/manual/en/language.function.section.php
HTML:
1
2
3
4
5
6
7
8
<ul class="flickr_setlist">
{section max=10 item=$setlist name=set}
    <li>
        <a href="{$setlist[set].link}"><img alt="{$setlist[set].title}" src="{$setlist[set].url}" /></a>
        <h2>{$setlist[set].title}</h2><div class="klein">({$setlist[set].photos} foto's)</div>
    </li>
{/section}
</ul>

[ Voor 82% gewijzigd door LuCarD op 24-04-2009 15:31 ]

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
LuCarD schreef op vrijdag 24 april 2009 @ 15:27:
Je wilt het dus op template niveau oplossen...

Dat kan toevallig met smarty wel, maar dan moet je section gebruiken in plaats van foreach.

http://smarty.net/manual/en/language.function.section.php
HTML:
1
2
3
4
5
6
7
8
<ul class="flickr_setlist">
{section max=10 item=$setlist name=set}
    <li>
        <a href="{$setlist[set].link}"><img alt="{$setlist[set].title}" src="{$setlist[set].url}" /></a>
        <h2>{$setlist[set].title}</h2><div class="klein">({$setlist[set].photos} foto's)</div>
    </li>
{/section}
</ul>
Hmm, in dat geval krijg ik deze foutmelding:

string(150) "Smarty error: [in module_file_tpl:Flickr;setlist.tpl line 18]: syntax error: unknown section attribute - 'item' (Smarty_Compiler.class.php, line 1096)"

En daaronder wordt alleen het laatst toegevoegde album weergegeven. We zijn wel op de goede weg denk ik...

Acties:
  • 0 Henk 'm!

  • iH8
  • Registratie: December 2001
  • Laatst online: 17-06-2024

iH8

.iteration

iteration contains the current loop iteration and always starts at one, unlike index. It is incremented by one on each iteration.

http://smarty.net/manual/en/language.function.foreach.php


edit: ik kan alleen zo geen manier vinden om die iteratie te stopppen als ie 10 bereikt. section is voor meerdere arrays.

[ Voor 63% gewijzigd door iH8 op 24-04-2009 15:54 ]

Aunt bunny is coming to get me!


Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Verwijderd schreef op vrijdag 24 april 2009 @ 15:38:
[...]


Hmm, in dat geval krijg ik deze foutmelding:

string(150) "Smarty error: [in module_file_tpl:Flickr;setlist.tpl line 18]: syntax error: unknown section attribute - 'item' (Smarty_Compiler.class.php, line 1096)"

En daaronder wordt alleen het laatst toegevoegde album weergegeven. We zijn wel op de goede weg denk ik...
errrm sorry item moet loop zijn....


Maar dat had je ook zelf kunnen zien op de link die ik had gegeven ;)

Je kan er namelijk nog meer instellen dus misschien is het handig om even te kijken....

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
errrm sorry item moet loop zijn....


Maar dat had je ook zelf kunnen zien op de link die ik had gegeven ;)

Je kan er namelijk nog meer instellen dus misschien is het handig om even te kijken....
Jaaaa!!! :-) Wow, dit werk! En nogmaals, sommige dingen zijn voor jullie misschien vanzelfsprekend, maar voor mij als php/smarty-leek niet echt. Top dat het nu op template-niveau op te lossen is. Op deze manier kan ik ook redelijk eenvoudig een archief gaan aanmaken.

Bedankt!
Pagina: 1