login  Naam:   Wachtwoord: 
Registreer je!
 Forum

PHP Nadenkvraag - elke Nth ronde uit een loop iets uitvoeren

Offline Martijn - 19/09/2012 16:29 (laatste wijziging 19/09/2012 16:31)
Avatar van MartijnCrew PHP Ik heb een situatie waar ik geen oplossing op hoef, deze kan ik prima zelf bedenken.
Het lijkt me een leuk idee om met ervaren en beginnende programmeurs over situaties na te denken

De Situatie:
We hebben een loop en we willen elke Nth ronde (bv elke vierde) een echo plaatsen. Hoe doe je dat het meeste efficientst?

Ikzelf gebruik altijd de modulus (zie voorbeeld), maar in de vorige php nadenkvraag bleek dat op grote schaal niet zo snel te zijn:

  1. $i = 1;
  2. $n = 4; // elke 4e keer...
  3. while($i < 1000){
  4. if($i % $n === 0){ echo 'x';}
  5. $i++;
  6. }


Praktisch voorbeeldje: Je hebt een productoverzicht en je wilt elke laatste van je 4 items op een rijtje de class 'laatste' meegeven.

edit: Om vergelijken makkelijk te houden, allemaal een while gebruiken. Een for() kan ook prima en is misschien handiger, maar het gaat even om de inhoud van de loop

13 antwoorden

Gesponsorde links
Offline vinTage - 19/09/2012 23:09 (laatste wijziging 19/09/2012 23:10)
Avatar van vinTage Nieuw lid Geen idee of het echt snel is, maar wel sneller dan je 'instap'code gok ik 

  1. <?php
  2. $count = 0;
  3. $temp = 0;
  4. do{
  5. if(($temp & 4) == 0){
  6. echo 'bla<br />';
  7. $temp++;
  8. }
  9. else
  10. {
  11. echo 'break<br />';
  12. $temp = 0;
  13. }
  14. }while($count++<1000);


Wel lijkt het me verstandig dat jij zelf alle 'toevoegingen' benchmarkt/opslaat [sarc]op sima's nieuwe hosting...

Niet dat ik er iets op tegen heb om WouterJ z'n host/script te gebruiken, maar misschien voelt hij zich niet (meer) geroepen?
Daarbij zijn dit wel geinige experimentjes waar heel de communitie wat aan heeft en hoor je sowieso niet te vertrouwen op de inzet/kosten van leden, dus uplink had ergens toch wel een goed punt 
Offline Wijnand - 20/09/2012 08:59 (laatste wijziging 20/09/2012 09:00)
Avatar van Wijnand Moderator Ik heb een aantal testen gedaan, en als je de ++ voor de var zet, gaat hij net iets sneller:

  1. $i = 1;
  2. $n = 4; // elke 4e keer...
  3. while($i < 10000){
  4. if($i % $n === 0){ echo 'x';}
  5. ++$i;
  6. }


Ook heb ik getest met -- (dus beginnen bij een aantal en dan aflopen), dat gaat toch minder snel dan ++ ervoor. Ik had ooit gehoord van iemand die zei dat -- sneller was, maar bij mijn test-case was dit dus niet het geval.
Offline Martijn - 20/09/2012 09:29 (laatste wijziging 20/09/2012 10:19)
Avatar van Martijn Crew PHP @vintage: werkt dat ook? Volgens mij niet:
  1. echo 1&4 ==0 ? 'T':'F'; // Geeft: F
  2. echo 2&4 ==0 ? 'T':'F'; // Geeft: F
  3. echo 3&4 ==0 ? 'T':'F'; // Geeft: F
  4. echo 4&4 ==0 ? 'T':'F'; // Geeft: F
  5. echo 5&4 ==0 ? 'T':'F'; // Geeft: F
  6. echo 6&4 ==0 ? 'T':'F'; // Geeft: F


@Wijnand: Dan zou dit ook mogelijk kunnen helpen:
  1. $i = 0;
  2. $n = 4; // elke 4e keer...
  3. while($i < 10000){
  4. if(++$i % $n === 0){ echo 'x';};
  5. }


Het verschil tussen waar de ++ staat:
  1. $i = 0;
  2. echo $i++; // 0
  3. echo $i; // 1
  4.  
  5. $j = 0;
  6. echo ++$j; // 1
  7. echo $j; // 1

------------------------------------
Edit: Mijn code met wat stukjes van anderen:
  1. $i = 1;
  2. $n = 4; // elke 4e keer...
  3. while($i < 1000){
  4. if($i++ === 4){ echo 'x'; $i=1;}
  5. }
Offline vinTage - 20/09/2012 15:41
Avatar van vinTage Nieuw lid
Martijn schreef:
@vintage: werkt dat ook? Volgens mij niet:

Je bedoeld mijn code ? Die werkt gewoon hoor, of bedoel je iets anders?
Offline Martijn - 20/09/2012 16:32
Avatar van Martijn Crew PHP ja, jouw code. Want ik heb t getest, zie mij vorige reactie het begin, en dan zou ik bij nr4 een T(rue) moeten krijgen. Tenzij ik t verkeerd begrijp 
Offline vinTage - 20/09/2012 16:57
Avatar van vinTage Nieuw lid Als je mijn code test, dan zie je toch 4 keer bla en dan een break?

jouw bitwise vergelijk moet nog tussen (haakjes)

(1&1)==0
Offline WouterJ - 20/09/2012 17:05
Avatar van WouterJ HTML gevorderde Vintage's code werkt hier ook niet: (martijn was de haakjes vergeten)
  1. echo (1&4) ==0 ? 'T':'F'; // Geeft: T
  2. echo (2&4) ==0 ? 'T':'F'; // Geeft: T
  3. echo (3&4) ==0 ? 'T':'F'; // Geeft: T
  4. echo (4&4) ==0 ? 'T':'F'; // Geeft: F
  5. echo (5&4) ==0 ? 'T':'F'; // Geeft: F
  6. echo (6&4) ==0 ? 'T':'F'; // Geeft: F

Dit is ook het antwoord wat hoort, als ik het even beredeneer:
  1. 1 = 0000 0001
  2. 2 = 0000 0010
  3. 3 = 0000 0011
  4. 4 = 0000 0100
  5. 5 = 0000 0101
  6. 6 = 0000 0110
  7.  
  8. 0000 0001 0000 0010 0000 0011
  9. 0000 0100 0000 0100 0000 0100
  10. ----------AND ----------AND ----------AND
  11. 0000 0000 = 0 0000 0000 = 0 0000 0000 = 0
  12.  
  13. 0000 0100 0000 0101 0000 0110
  14. 0000 0100 0000 0100 0000 0100
  15. ----------AND ----------AND ----------AND
  16. 0000 0100 = 4 0000 0100 = 4 0000 0100 = 4
Offline vinTage - 20/09/2012 17:15
Avatar van vinTage Nieuw lid http://78.20.169.150:5151/blaat.php

Hier werkt het wel ? 
Offline Pieter - 21/09/2012 08:11
Avatar van Pieter Gouden medaille

SEO guru
Ipv de class toe te kennen, zou ik het volledig in CSS doen.
Geen php hiervoor nodig als het puur visueel is .

  1. <style>
  2. ul:nth-child(4n) { //Hier de classgegevens.
  3. color: #333;
  4. }
  5. </style>
  6.  
  7. <ul>
  8. <?php
  9. $i = 1;
  10. while($i < 1000){
  11. echo '<li>'.$i.'</li>';
  12. ++$i;
  13. }
  14. ?>
  15. </ul>

Bedankt door: Joel, vinTage
Offline Martijn - 21/09/2012 09:14
Avatar van Martijn Crew PHP Ja, dan ga je uit van iets waar je visueel een verschil wilt het voorbeeld dat ik gaf was slechts een voorbeeld. Maar om toch inhoudelijk te reageren, werkt dat ook in IE8?
Offline Pieter - 21/09/2012 10:02
Avatar van Pieter Gouden medaille

SEO guru
@Martijn, nope, enkel de moderne browsers die CSS3 treffelijk ondersteunen. IE8 valt daar net buiten. 
Offline WouterJ - 22/09/2012 09:31
Avatar van WouterJ HTML gevorderde Pieter, moet het niet li:nth-child(4n) zijn?
Offline Pieter - 24/09/2012 08:23
Avatar van Pieter Gouden medaille

SEO guru
@WouterJ, you got me there! Inderdaad, daar was ik even te snel/slordig.
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.287s