Hoe voorkom je 'doordraaien' while-loop?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Dh boor

dh boor

29/04/2014 19:39:56
Quote Anchor link
Stel ik wil dat een while-loop een getal laat zien, steeds een ander getal, maar wel ieder getal maar een keer.

Zoiets als:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$aS
= array();
do
{
   $t = rand (1, 10);
   $aS = array_push ($t, $aS,)
   echo $t;
}

while (iets);
?>


Het script zal vast niet helemaal foutloos zijn, maar het idee is duidelijk:
Na 10 keer gaat het programma weer op zoek naar een getal dat nog niet getoond is maar kan niets vinden en zal dus maar steeds opnieuw die do...while blijven doen, op zoek naar een niet meer voorhanden zijnd nummer...
Hoe dit te voorkomen?

op een gegeven moment, in dit geval na
 
PHP hulp

PHP hulp

23/11/2024 11:23:47
 
Jan terhuijzen

jan terhuijzen

29/04/2014 20:23:07
Quote Anchor link
Door je verstand te gebruiken en een logische voorwaarde te geven aan een loop?
Bijna altijd als je programma terecht komt in een oneindige lus heb je iets verkeerd gedaan.
Je kunt natuurlijk ook een soort beveiliging inbouwen door een variabele te maken, en die elke nieuwe lus in de loop met 1 te verhogen, als je dan bijvoorbeeld bij de 1000 bent, doe je een break.
Als je een lus met mysql doet om bijvoorbeeld een lijst te vullen moet je ook altijd LIMIT gebruiken in je queries.
Gewijzigd op 29/04/2014 20:25:48 door jan terhuijzen
 
Frank Nietbelangrijk

Frank Nietbelangrijk

29/04/2014 21:51:47
Quote Anchor link
Als je niet wilt dat je twee of meer keren hetzelfde getal krijgt dan heb je niets aan de functie rand().

In dat geval moet je met een array werken:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
    // maak een array met tien getallen
    $array = range(1 , 10);
    
    // even schudden voor gebruik
    shuffle($array);
    
    // dan allemaal even laten zien.
    foreach($array as $element)
        echo $element.'<br>';
        
?>
 
Dh boor

dh boor

29/04/2014 22:06:16
Quote Anchor link
Ah, mn verstand gebruiken. Nooit aan gedacht.
maarhee, dit forum is voor beginners toch?
Wat ik natuurlijk bedoelde was of er zo'n soort functie is zoals dat LIMIT waar jij t over hebt.
Maar dat is blijkbaar niet zo.
bedankt voor je antwoord.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

29/04/2014 22:52:51
Quote Anchor link
Het is niet zo moelijk hoor, scriptje voor de lotto trekking:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$draw
= array();
while (count($draw) < 7) {
    $random = rand(1, 45);
    if(!in_array($random, $draw) {
        $draw[] = $random;
    }
}

print_r($draw);
?>
Gewijzigd op 29/04/2014 22:53:49 door Ger van Steenderen
 
Frank Nietbelangrijk

Frank Nietbelangrijk

29/04/2014 23:17:32
Quote Anchor link
@Ger: Het nadeel van jouw script is dat het lang kan duren voordat de laatste getallen getrokken worden.

Met name als je van die 45 een groter getal maakt, laten we zeggen duizend(en) dan blijft jouw script lang zoeken naar het ene getal dat ontbreekt. Daar heb je in mijn voorbeeld geen last van.

Toevoeging op 29/04/2014 23:23:48:

EDIT

had de < 7 niet gezien
Gewijzigd op 29/04/2014 23:19:25 door Frank Nietbelangrijk
 
Ivo P

Ivo P

30/04/2014 08:41:57
Quote Anchor link
Ik denk dat franks oplossing, al dan niet aangevuld met een array_slice het efficiëntste is.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

30/04/2014 12:08:14
Quote Anchor link
Als je het over performance hebt, is het verkeerd gedacht:

Met duizend loops:
Frank: 0.0052769184112549
Ger: 0.0049278736114502

Gaat nergens over natuurlijk, maar toch .....
 
Mark Hogeveen

Mark Hogeveen

30/04/2014 12:11:08
Quote Anchor link
Heb nog misschien een leuke oplossing:
Het hoeft niet eens per-see met een loop!
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$getallen
= array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
echo shuffle($getallen);
?>

Of bij grotere range van getallen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
// Laat PHP de array vullen
$getallen = array();
for($i = 0; $i < 1000; $i++) {
    $getallen[] = $i;
}

echo shuffle($getallen);
?>
Gewijzigd op 30/04/2014 12:13:02 door Mark Hogeveen
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

30/04/2014 12:14:54
Quote Anchor link
Meer een fatale oplossing!
Je hebt het al veranderd ;-)
Gewijzigd op 30/04/2014 12:17:20 door Ger van Steenderen
 
Mark Hogeveen

Mark Hogeveen

30/04/2014 12:17:17
Quote Anchor link
Leg eens uit? a.u.b. is dit gevaarlijk?
Gewijzigd op 30/04/2014 12:17:37 door Mark Hogeveen
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

30/04/2014 12:30:57
Quote Anchor link
Je gebruikte een niet bestaande functie ....
 



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.