Ik heb jullie nog maar kort geleden gevonden; ik hoop dus dat ik mijn vraag op de juiste plaats stel. Corrigeer me anders maar.
Als deel van een groter script, probeer ik in PHP een script te schrijven waarmee ik een uitgangsgetal kan veranderen en dat wil ik kunnen herhalen. Stel dat het uitgangsgetal 0 is, dan wil ik (in het eenvoudigste geval) dat hetzij verhogen, hetzij verlagen met 1 en zo vervolgens. Dat script toont twee knoppen: + en -. Het lijkt op pagineren, maar dat is het niet; ik wil ook de mogelijkheid hebben dat bijvoorbeeld de +knop kwadrateert en de -knop staat voor n-1. Ik weet dus niet op voorhand wat het hoogste of laagste getal zal zijn. Als ik in een zichzelf aanroepend script (dus [PHP_SELF]) start met $n=0, + geeft $n=$n+1 en - geeft $n=$n-1, dan gaat dat één keer goed. Maar omdat php 'ziet' dat $n=0, kom ik niet verder. Hoe ontsnap ik daar aan? Hoe kan ik (bijvoorbeeld) uitgaande van 10, de +knop kwadraterend en de -knop als -1, komen op eerst 100 en dan op 99? En dan verder? Toen ik er aan begon, dacht ik dat het eenvoudig was; misschien is het dat ook!
Excuus voor het lange verhaal, ik kon het niet korter.
Met vriendelijke groet,
Jan Pluys
4 antwoorden
Gesponsorde links
Thomas - 24/08/2014 16:07 (laatste wijziging 24/08/2014 16:52)
Moderator
Ik weet niet precies wat je (uiteindelijk) probeert te bereiken met je script, maar laat ik proberen in mijn eigen woorden samen te vatten wat ik denk wat je probeert te doen.
Omdat je het over knoppen hebt lijkt het alsof het script interactie heeft met een gebruiker? De gebruiker start met een (random of zelf ingegeven?) getal en klikt vervolgens op de [+] of [-] knop. Hier zit een (random of voorgeschreven?) operatie achter, die een wiskundige bewerking uitvoert op het getal. Deze knop dient tevens als verzend-knop (het script bevat een formulier dat naar zichzelf POST). Dit alles geschiedt in PHP. Klopt het zover een beetje?
Er zijn denk ik 3 dingen waar je rekening mee moet houden:
- In eerste instantie moet er onderscheid gemaakt worden tussen de eerste aanroep van het script (waarbij dus een random getal ingegeven of gegenereerd wordt) en daaropvolgende aanroepen (waarbij dit getal dus uit het formulier moet komen). Als je het getal elke keer initialiseert op 0 dan negeer je daarmee dus elk mogelijk eerder ingegeven getal. Je zult ook op een of andere manier moeten controleren dat je te maken hebt met een geldig getal (het verstuurde getal zal gevalideerd moeten worden). Vanwege de aard van HTTP (deze is "stateless", oftewel onthoudt niets van vorige pagina-aanroepen) zul je deze waarde dus ook door moeten geven. Dit kan via het formulier (POST) maar ook via de URL (GET).
- Dan is daar de (random?) selectie van de [+] en [-] operaties, hoe geschiedt deze? Hoeveel verschillende operaties zijn er precies? Zijn deze specifiek voor de [+] of [-] knop? Hangt de operatie af van hoeveel keer er op een (specifieke) knop is gedrukt? Of is dit alles "random"? Daarnaast: zijn er nog andere restricties, bijvoorbeeld: ondanks het feit dat de bepaling van de wiskundige operatie semi-random is mag dit niet resulteren in het twee keer achter elkaar uitvoeren van eenzelfde operatie (bijvoorbeeld: twee keer achter elkaar kwadrateren). Dit zul je dan trouwens ook op een of andere manier moeten onthouden .
- En tot slot, wanneer "eindigt" dit spel? Is er een klik-limiet of een ander criterium dat bepaalt dat je klaar bent met klikken? En moet er na afloop nog iets extra's gebeuren, moet dit getal bijvoorbeeld ergens permanent(er) worden opgeslagen? Want als je je browser sluit ben je het berekende getal kwijt. Er wordt trouwens ook geen historie bijgehouden van het getal waarmee je startte, of welke operaties hier onderweg op uit zijn gevoerd.
Wellicht kun je een licht werpen op wat je precies probeert te bereiken met dit alles want het doel ontgaat mij een beetje. Of is dit bedoeld als een meer algemene oefening?
EDIT: Dit alles zou je zelfs in JavaScript kunnen bouwen, dan heb je ook geen overhead van formulier(afhandeling).
EDIT: En als er geen interactie is met gebruikers kun je dit alles in een lus-constructie zetten (for/foreach/while/do). Je zult dan wederom condities moeten definiëren waaronder de lus eindigt anders loopt het script vast in een oneindige lus.
EDIT: Je bent nog altijd beperkt door de "fysieke" grenzen van het type van je getal (deze bepalen een maximale positieve en maximale negatieve waarde die dit getal kunnen hebben).
Bedankt voor de reactie. Die maakt duidelijk dat ik in mijn streven een compact verhaal te geven nu en dan onduidelijk was. De bedoeling van dit script is cursisten te laten spelen met getallen. Afhankelijk van het bereikte niveau kan ik het zijn die een begingetal geef, het kan een random getal zijn of de cursist kan zelf een getal invoeren. Ook de bewerkingen kunnen variëren; er zijn wel altijd twee bewerkingen mogelijk. Door middel van geschikte variabelen is het niet moeilijk aan een gegeven knop een bewerking toe te schrijven en ook is het makkelijk een bijpassend opschrift aan een knop te geven. En natuurlijk moeten er grenzen gesteld worden en moet er geteld worden. Dat is het minst moeilijke. (Aan het valideren had ik, eerlijk gezegd, nog niet gedacht.)
De simpelste variant van deze opzet is hetzij 1 bij het begingetal op te tellen dan wel af te trekken. (Vandaar, in dit geval + en – op de knoppen; het had ook +1 en -1 kunnen zijn) Daarom ben ik daarmee gaan experimenteren. Om precies te zijn: ik ging uit van 0, links een knop met –, rechts een knop met +. Ondanks geprobeerde condities als if(!isset($nr)){$nr=0;} en wat ik heb kunnen bedenken, wordt de nieuw gegenereerde $n niet als zodanig herkend.
Ik geef hierbij het voor dit probleem relevante deel van mijn script:
Ik denk, dat als ik eenmaal weet hoe ik een veranderde variabele kan doorgeven, het niet moeilijk moet zijn om (om bij het gegeven voorbeeld te blijven) de ene knop te laten kwadrateren en de ander te laten aftrekken. Maar dat is van later zorg. Ik maak ergens een denkfout, maar waar, en welke?
Ik denk dat de ontbrekende stap het meegeven van het getal aan het formulier is. Op deze manier kan er echt iets "onthouden" worden. Variabelen "bestaan" normaal slechts tijdens de uitvoer van het script.
Het volgende is een voorbeeld, los gebaseerd op de bovenstaande code. Er zijn vele varianten denkbaar, maar dit zou je in de goede richting moeten sturen.
<?php
// initialisatie van het getal
if (isset($_POST['getal'])) {
// indien er eerder een formulier was verzonden, haal het getal uit het formulier
$getal = $_POST['getal'];
} else {
// indien er niet eerder een formulier was verzonden
$getal = 0;
}
// controleer altijd of het getal ook daadwerkelijk een getal was, dit kan op verschillende manieren
if (!is_numeric($getal)) {
// het getal was bij nader inzien toch geen getal (let op de ! in het if-statement)
$getal = 0;
}
// voer nu eventuele wiskundige bewerkingen uit
// dit moet gebeuren voordat je het formulier afdrukt, anders bevat $getal nog steeds de oude waarde
if (isset($_POST ['meer'])) {
$getal++;
}
if (isset($_POST['minder'])) {
$getal--;
}
?><form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<input type="hidden" name="getal" value="<?php echo $getal ?>" />
<input type="submit" name="minder" value="-" />
<input type="submit" name="meer" value="+" />
</form>
<?php
echo $getal.'<br />';
?>