For...next lus 0-255 in stappen van 15

Overzicht

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Ronald Vos

Ronald Vos

21/04/2024 10:01:35
Anchor link
Ik probeer een kleurentabel te maken in stappen van 15, want dan kom je mooi uit op 255.
Ik wil de waarden 0, 15,30...255 in een dropdown-list. Hoe krijg ik dat voor elkaar?
Ik heb zoiets geschreven als
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
echo <<<FORM
<form method="POST" action="$thisfile">
<label for <?$rr ?>Roodwaarde</label>
<Select>
FORM
;
for ($rr=0; $rr<=255; $rr+15) {
    $Achtergrondkleur=$rr;
    $Voorgrondkleur=255-$rr;
    echo "Achtergrondkleur= " $Achtergrondkleur;
    echo "Voorgrondkleur= " $Voorgrondkleur;
    echo "<option". [code]<? $Achtergrondkleur ?>
.">";
};
?>


Ik krijg dit dit op mijn scherm:
"Roodwaarde: " met een dropdown-icoon zonder inhoud.

Hoe krijg ik inhoud in de dropdown-list?
Gewijzigd op 21/04/2024 10:51:59 door - Ariën -
 
PHP hulp

PHP hulp

23/12/2024 06:58:15
 
- Ariën  -
Beheerder

- Ariën -

21/04/2024 10:50:53
Anchor link
De eerste stap is om te kijken hoe een Select-box in HTML is opgebouwd.
 
Ronald Vos

Ronald Vos

21/04/2024 11:02:48
Anchor link
Oké,
Ik was vergeten de sluit-tag voor select te plaatsen.

Maar mijn belangrijkste vraag gaat over de for...next-lus.
Wil je daar specifiek naar kijken?

Ik denk wel dat ik eruit kom met HTML, al vind ik het wel lastiger in combinatie met PHP.

Bij voorbaat dank,
Ronald.
 
Rob Doemaarwat

Rob Doemaarwat

21/04/2024 11:32:54
Anchor link
Bijna goed: het is "+=" ipv "+" in het 3e deel van de for():
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php

for ($rr=0; $rr<=255; $rr+=15) ...

?>
 

22/04/2024 11:14:28
Anchor link
Mocht je vaker een loop nodig hebben die van waarden 0 tot en met 255 gaat, dan is het efficiënter om dat maar 1 keer te laten berekenen en de resultaten op te slaan in een array.
Daarna kan je zo vaak als je maar wilt gebruik maken van het array, en hoef je niet meer na te denken over de logica. Bijvoorbeeld:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$per15
=[];$n=-10;while($n<111){$per15[]=base_convert($n+=10,15,10);}
foreach($per15 as $rr){print $rr.PHP_EOL;}
Gewijzigd op 22/04/2024 11:16:36 door
 
Ozzie PHP

Ozzie PHP

23/04/2024 12:33:47
Anchor link
Wat is dit voor constructie Ad Fundum? Hoe werkt het?
 
Ronald Vos

Ronald Vos

23/04/2024 12:42:44
Anchor link
Ozzie PHP op 23/04/2024 12:33:47:
Wat is dit voor constructie Ad Fundum? Hoe werkt het?


Dat wilde ik ook al gaan vragen, bedankt Ozzie.
Ik wil sowieso een oproep plaatsen:
Ik ben heel blij met de oplossingen die gegeven worden, maar het zou zeer prettig zijn als het commentaar uitlegt waar de code voor staat. Dus graag niet alleen de code, maar ook de uitleg erbij.

Bij voorbaat dank.

Ronald
Gewijzigd op 23/04/2024 12:45:33 door Ronald Vos
 

23/04/2024 21:15:12
Anchor link
Simpel, $per15 is een array dat met een for loop wordt gevuld met stappen van 15, door de variabele $n te gebruiken in een while loop.
Na het vullen van het array kan je met foreach zo vaak als je wilt dezelfde sequens aflopen, dat scheelt tijd voor het uitrekenen (ten koste van geheugen voor de lookup-table).
Ja, de base_convert() kan natuurlijk net zo goed weg, hij verdonkeremaand waar het echt om gaat. Maar gezien dat dat deel van oplossing al eerder gegeven was door Rob vond ik dit wel een creatief alternatief. Zo kom je nog eens wat anders tegen.

Nou oke, $n wordt elke stap met 10 groter wordt gemaakt, om vervolgens door base_convert() te worden aangezien als stappen van 15 vanwege het 15-tallig talstelsel in het tweede argument. Vervolgens rekent base_convert() dat weer terug naar het decimale talstelsel zodat er stapjes van 15 uitkomen.
Gewijzigd op 23/04/2024 21:21:20 door
 
Ozzie PHP

Ozzie PHP

24/04/2024 01:36:30
Anchor link
Het zal aan mij liggen en het is al laat ... maar wat doet base_convert precies, waarom gebruik je het en wat is het verhaal van die 111?
 
Jan R

Jan R

24/04/2024 07:52:58
Anchor link
het commando leidt rechtstreeks naar de handleiding waar het uitgelegd wordt :)

1° parameter is het startgetal in X-base formaat bepaald in parameter 2
binair 1111 = decimaal 15 = hexdecimaal F
en wordt omgevormd naar de 3° parameter

base_convert(22,10,2); = 10110
base_convert(22,10,10); = 22
base_convert(22,10,16); = 16

Die 111 wordt dan gezien param2 (=15) geconverteerd naar 241 param3(10)
Gewijzigd op 24/04/2024 07:55:13 door Jan R
 

24/04/2024 07:55:28
Anchor link
base_convert() doet hetzelfde als hexdec(), dechex() en bindec(), en lijkt sterk op octdec() en hex2bin().
Wat mij nu pas opvalt is dat in de documentatie van sommige van die functies zelfs een info of warning-blokje staat met de melding dat je zelf moet oppassen dat je niet te grote integers gebruikt vanwege impliciete type casting naar floats.

In ieder geval zet base_convert() getallen om van en naar verschillende talstels, variërend van 2 tot en met 36. In de documentatie heeft een programmeur zelfs een eigen implementatie in PHP geschreven die nog meer talstelsels aankan. Dus of je nou tot 1 telt voordat je 10 krijgt (binair), tot 9 (decimaal) of tot F (hexacimaal) of tot E (vijftientallig), base_convert() zet het voor je om. In dit geval wordt 0 => 0, 10 => 15, 20 => 30, etc.

Er passen precies 13 stappen van 15 in het rijtje van 0 tot en met 255. Omdat $n elke keer met 10 verhoogd wordt VOORdat $n aan base_convert() wordt meegegeven, loopt $n effectief van 0 tot en met 120 (13 stappen van 10).
Omdat in de while() gebruikt gemaakt wordt van de kleiner-dan operator, in plaats van de kleiner-dan-of-gelijk-aan operator, checkt-ie dat $n kleiner is dan 111, anders zou dat $n <= 110 zijn. Je leest in de code -10 tot 111, maar aan base_convert() wordt 0 tot en met 120 meegegeven in stappen van 10.

Beter leesbaar zou zijn:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$per15
= Array();
$n = 0;
while ($n <= 120) {
  $per15[] = base_convert($n, 15, 10);
  $n = $n + 10;
}


foreach ($per15 as $rr) {
  print $rr . PHP_EOL;
}

?>

Kortom, voor het maken van stappen van 15 kan je beter de for-lus van Rob gebruiken, dan is het in één keer duidelijk.
Maar het is ook wel wat saai voor het forum. Nog een variatie op hetzelfde thema:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
$per15
= [];
$i = null;
for (;;) {
  $per15[] = base_convert(10 * $i++, 15, 10);
  if ($i > 12) { break; }
}

foreach ($per15 as $rr) {
  print $rr . PHP_EOL;
}

?>

Wat ik daaraan wel weer opmerkelijk vindt is deze constructie:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$i
= null;
print ++$i;  // geeft 1
?>

Dat werkt in SQL niet zo, als je dan een SELECT NULL + 1 doet, is het resultaat NULL.

Zoals PHP werkt, doet mij denken aan een leus van Loesje over de big bang theorie:
"Eerst was er niets en toen is dat nog ontploft ook."
Helaas is die leus gekaapt door evangelisten, maar dat is wel compleet off-topic.
Gewijzigd op 24/04/2024 08:21:12 door
 
Ronald Vos

Ronald Vos

24/04/2024 11:08:47
Anchor link
Quote:
Er passen precies 13 stappen van 15 in het rijtje van 0 tot en met 255.

Volgens mijn berekening zijn het er 17 en inclusief de "0"-waarde: 18.

255/15=17.
Gewijzigd op 24/04/2024 11:10:23 door Ronald Vos
 
Ozzie PHP

Ozzie PHP

24/04/2024 11:49:57
Anchor link
Hmmm, die getallenstelsels gebruik ik nooit. Snap ook niet helemaal het nut.

@Ad Fundum

Jij gaf deze code:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?
$per15
=[];$n=-10;while($n<111){$per15[]=base_convert($n+=10,15,10);}
foreach($per15 as $rr){print $rr.PHP_EOL;}
?>


Wat is dan het verschil met de onderstaande code?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$per15
= [];
for ($i=0; $i<=255; $i+=15) {
  $per15[] = $i;
}

?>
 
Ronald Vos

Ronald Vos

24/04/2024 12:00:59
Anchor link
@ozzie PHP:
zie mijn eerste vraag.
Ik wil een kleurentabel maken met stappen van 15 omdat je dan mooi uitkomt op 255.
Deze veelvouden van 15 wil ik in een dropdown-menu stoppen om de roodwaarde te kiezen.

Dit laatste is mij echter nog niet gelukt.

Ik weet dat deze code lang niet volledig is. Ik weet dat de sluittag voor select er nog niet in staat, maar mijn vraag is:
hoe krijg ik de waarden in het dropdown-menu?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
echo <<<FORM
<form method="POST" action="$thisfile">
<label for "Roodwaarde"</label>
<Select>
FORM
;
for ($rr=0; $rr<=255; $rr+=15) {
    $Achtergrondkleur=$rr;
    $Voorgrondkleur=255-$rr;
    echo "Achtergrondkleur= " $Achtergrondkleur;
    echo "Voorgrondkleur= " $Voorgrondkleur;
    echo "<option". [code]<? $Achtergrondkleur ?>
.">";
};
?>

Daarom deze vraag.
Gewijzigd op 24/04/2024 12:09:31 door Ronald Vos
 
Ozzie PHP

Ozzie PHP

24/04/2024 12:08:54
Anchor link
Maak eerst eens het dropdown menu gewoon in html code met daarin slecht 2 opties. Dan hebben we een idee hoe het eruit moet komen te zien, en dan kunnen we daarna de php-code erin zetten.
 
Ronald Vos

Ronald Vos

24/04/2024 12:23:49
Anchor link
Goede vraag.
Het moet er ongeveer zo uit komen te zien?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<label for "Roodwaarde">Roodwaarde</label>
<select>
<option value="0">0</option>
<option value="15">15</option>
<option value="30">30</option>
</select>


Bij voorbaat dank voor je geduld.

Ronald
Gewijzigd op 24/04/2024 12:24:23 door Ronald Vos
 
Ozzie PHP

Ozzie PHP

24/04/2024 14:17:48
Anchor link
Ik zou je html buiten de php-code houden. En dan krijg je bijv. zoiets als dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<label for "Roodwaarde">Roodwaarde</label>
<select>
<?php
for ($rr=0; $rr<=255; $rr+=15) {
  echo '<option value="' . $rr . '">' . $rr . '</option>' . PHP_EOL;
}
    
?>

</select>
 
Ronald Vos

Ronald Vos

24/04/2024 15:34:24
Anchor link
Bedankt ozzie voor je suggestie, maar hij doet het nog steeds niet helemaal.

Ik heb jouw voorbeeld overgenomen en er nog iets bij gezet: name="Roodwaarde".

De complete zoals ik hem nu heb, is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<html>
<head>
<title>Kleurtabellen per Roodwaarde</title>
</head>
<body>
<form action="$thisfile">
<label for "Roodwaarde">Roodwaarde</label>
<Select>

<?php
for ($rr=0; $rr<=255; $rr+=15) {
    echo '<option name="Roodwaarde" value="' . $rr . '">' . $rr . '</option>'. PHP_EOL;
}

?>

</Select>
</form>
</body>
</html>


Moet er geen ";" achter de sluit-accolade van de for...next-lus?

Heb ik nog iets over het hoofd gezien?
Gewijzigd op 24/04/2024 15:38:11 door Ronald Vos
 
- Ariën  -
Beheerder

- Ariën -

24/04/2024 15:48:24
Anchor link
Nee, omdat het een voorwaarde is, net als bij while().

Verder is je HTML niet correct, het is:
<label for="Roodwaarde">Roodwaarde</label>

Verder heeft $thisfile hier geen waarde:
<form action="$thisfile">

En het is wel handig als je select-element een name-attribuut heeft.
Gewijzigd op 24/04/2024 15:53:46 door - Ariën -
 

25/04/2024 09:54:33
Anchor link
Ronald Vos op 24/04/2024 11:08:47:
Quote:
Er passen precies 13 stappen van 15 in het rijtje van 0 tot en met 255.

Volgens mijn berekening zijn het er 17 en inclusief de "0"-waarde: 18.

255/15=17.

Ja, jouw berekening klopt en de mijne niet.
Ik zocht een creatieve manier en kreeg dit rijtje:
0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 225, 240, 255

Op het eerste gezicht leek het goed, maar tussen 135 en 225 horen natuurlijk nog wat meer stappen van 15. Het onjuiste resultaat is de prijs voor het schenden van het KISS-principe. Het is een voorbeeld geworden van hoe het niet moet.

Toevoeging op 25/04/2024 10:02:30:

Ozzie PHP op 24/04/2024 11:49:57:
Hmmm, die getallenstelsels gebruik ik nooit. Snap ook niet helemaal het nut.

@Ad Fundum

Jij gaf deze code:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?
$per15
=[];$n=-10;while($n<111){$per15[]=base_convert($n+=10,15,10);}
foreach($per15 as $rr){print $rr.PHP_EOL;}
?>


Wat is dan het verschil met de onderstaande code?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$per15
= [];
for ($i=0; $i<=255; $i+=15) {
  $per15[] = $i;
}

?>

Afgezien van dat alleen onderstaande code het juiste resultaat geeft, is het ook duidelijker en minder creatief. Het is het beste voor code in productie. Ik heb met base_convert() ingewikkeld willen doen om het eens over een andere boeg te gooien. Tegelijk heb ik base_convert() voorheen ook te weinig gebruikt om in eerste instantie te zien dat bij de overgang van 90 naar 100 decimaal een significant verschil optreedt.

Maar de variaties op de for-lus zijn verder wel goed.
Al is het wel even wennen om terug gaan
van: for x in (0..255).step_by(15) { // Rust
naar: for ($i=0; $i<=255; $i+=15) { // PHP
Het ging er in ieder geval om dat het ook een optie is om een look-up table te gebruiken wanneer je vaker met hetzelfde rijtje moet werken. Alleen is het met het geval 15 waarschijnlijk nog efficiënter om dat zonder look-up table te doen, omdat het rijtje "xor", "add" en "jne" (assemblerinstructies voor een loop) sneller werkt dan het telkens dereferencen van gegevens uit een array. Maar voor ingewikkelder berekeningen kan het wel helpen.

Maargoed, wat PHP betreft heb ik me er inmiddels bij neergelegd. Ik ben weer bezig met een aantal websites in PHP 8.2. Dat kost (mij) toch minder moeite met PHP dan met Rust.
Gewijzigd op 25/04/2024 10:17:22 door
 
Ward van der Put
Moderator

Ward van der Put

25/04/2024 12:14:40
Anchor link
De topicstarter heeft duidelijk nog niet heel goed nagedacht over hoe een kleurkiezer zou moeten werken.

Bijvoorbeeld zo:

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/color

Probeer anders als (huiswerk)opdracht voor Koningsdag maar eens het vermiljoen-rood #a91f32 uit de Nederlandse vlag in te stellen...
 

Pagina: 1 2 volgende »

 

Dit topic is gesloten.



Overzicht

 
 

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.