if/ else statement verwijzen naar stap (x)

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Kevin damstra

kevin damstra

19/01/2010 22:59:00
Quote Anchor link
Goedemorgen,

Voor een verhuurservice ben ik bezig met het maken van een script die bepaald wat de klant uiteindelijk gaat betalen. Nu is hiervoor al jarenlang hetzelfde systeem in gebruik namelijk; er zijn 3 prijscategorieen.

Huurt de klant het artikel maar voor 1 dag dan is de prijs wat hoger.

Huurt de klant voor meerdere dagen dan is het tarief per dag iets lager dan de prijs voor een losse dag.

Huurt de klant het artikel voor een week (5,6 of 7) dagen dan wordt hier een weektarief voor gerekend

Het eerste deel voor het huren van een de artikelen (tot en met de weekprijs) kan ik oplossen door het gebruiken van else/ if statements.

Nu het probleem wat als ik een rest heb. Ik huur het artikel voor 9 dagen.
Dan heb ik de weekprijs + 2 * een meerdagen tarief.

Ik wil dan het aantal huurdagen omzetten in het aantal huur_weken.
het aantal huurweken afronden naar beneden. Nu heb ik een rest.
Nu vermenigvuldig ik het aantal afgeronde huurweken met 7 zodat k het aantal dagen in de weken weet.

Daarna trek ik het aantal week dagen van het aantal huurdagen af en heb ik de resterende huurdagen.

De resterende dagen moeten worden vermenigvuldigt met de meer_dagen tarieven.

Totaal prijs: is aantal huurweken + aantal resterende dagen.

Tot zover ben ik gekomen:

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
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php>

$prijs = array(
    'losse_dag' => 5,
    'meerdagen' => 4,
    'week' => 20
);

$aantal_huurdagen = 9;
//Aangenomen getal, deze komt straks uit de functie waarbij strtotime wordt gebruikt om het dagen verschil te bepalen uit een eind en begin datum.

$aantal_huurweken = $aantal_huurdagen /7;
$aantal_huurweken_afgerond = floor($aantal_huurweken);

if ($aantal_huurdagen == 0)
{
    $totaal_prijs = ($aantal_huurdagen + 1) * $prijs['losse_dag'];
    // hier wordt 1 bij op geteld omdat als ik een dag blijf is mijn begin en eind datum gelijk en komt er 0 uit, dan zou de klant dus niks hoeven betalen.
}
elseif ($aantal_huurdagen < 5)
{
    $totaal_prijs = ($aantal_huurdagen +1) * $prijs['meerdagen'];
    // zie commentaar hierboven, de klant zou voor een dag te weinig betalen.
}
elseif ($aantal_huurdagen <= 7)
{
    $totaal_prijs = $aantal_huurweken * $prijs['week'];
}
elseif ($aantal_huurdagen > 7)
//mocht de klant het artikel huren voor 8 dagen is dit de weekprijs + een rest.
{
    $totaal_prijs = ($aantal_huurweken_afgerond * $prijs['week']) + ?);
    //Resterend aantal losse dagane moet bij het aantal weken opgeteld worden
}
?>


Ik kom dus vast te zitten nadat het aantal huurdagen groter als 7 wordt.
Nu ben ik beginner met php en weet ik niet of dit script uberhaupt werkt.

Ik wilde laten zien wat ik precies wil doen met het script.
Gewijzigd op 01/01/1970 01:00:00 door Kevin damstra
 
PHP hulp

PHP hulp

22/11/2024 07:42:05
 

19/01/2010 23:13:00
Quote Anchor link
Een elseif toevoegen of een switch.
 
- SanThe -

- SanThe -

19/01/2010 23:16:00
Quote Anchor link
En wat wil je als antwoord als er 40 dagen wordt gehuurd?
 
Pim -

Pim -

19/01/2010 23:41:00
Quote Anchor link
Bedoel je niet zoiets? Het was me niet helemaal duidelijk

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
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php

ini_set('display_errors', 1);
error_reporting(E_ALL | E_STRICT);

$inputBeginDatum = '14-03-1993';
$inputEindDatum = '19-01-2010';

// Zet de data om in een DateTime object (kijk maar eens op php.net hierover)
$beginDatum = DateTime::createFromFormat('d-m-Y', $inputBeginDatum);
$eindDatum = DateTime::createFromFormat('d-m-Y', $inputEindDatum);

// Bereken het verschil (automatisch)
$verschil = $eindDatum->diff($beginDatum);
// Zet het veschil om in een aantal dagen
$dagen = (int) $verschil->format('%a');

$prijs = array(
    'dag' => 2,
    'week' => 10,
    'maand' => 30
);

// Minder dan 1 week
if($dagen < 7)
    $prijs = $dagen*$prijs['dag'];

// Minder dan 1 maand. $dagen/7 is het aantal weken, met ceil() naar boven afgerond (ik neem aan dat je dat wilt)
elseif($dagen < 28)
    $prijs = ceil($dagen/7)*$prijs['week'];

else {
    $maanden = (int) $verschil->format('%m') + (int) $verschil->format('%y') * 12;
    
    // Als er een rest-stuk is, voeg een extra maand toe (haal dit weg als je het niet wilt)
    if((int) $verschil->format('%d') > 0)
        $maanden++;
        
    $prijs = $maanden*$prijs['maand'];
}


echo $prijs;

?>


Als het te ondeuidelijk is kan ik het wel even uitleggen.
Gewijzigd op 01/01/1970 01:00:00 door Pim -
 
Kevin damstra

kevin damstra

20/01/2010 11:57:00
Quote Anchor link
Goedemorgen, bedankt voor het meedenken.

Om het eenvoudig te maken wil de ik een dag week en maand prijs aankaarten, maar omdat maanden verschillend aantal dagen hebben maak ik het alleen amar moeilijker.

Ik heb de beginpost aangepast voor het werkelijke probleem dat moet worden opgelost.

Mijn excuses, als iemand me kan helpen ben ik daar erg dankbaar voor
 
Pim -

Pim -

20/01/2010 12:23:00
Quote Anchor link
Volgens mij heb ik juist dat probleem opgelost in het script hierboven. Wat mis je dan?
 
Kevin damstra

kevin damstra

20/01/2010 12:51:00
Quote Anchor link
Ja ik zie dat je het verschil overpakt in format dagen,
dus nadat het aantal weken zijn uitgerekend pak je hetgeen wat over is in het aantal dagen.

Maar daarna is de prijs het aantal weken * weektarief, ik zie het niet terug dat het rest wordt opgeteld bij het eerst bepaalde aantal weken.

Het script wat je hebt samengesteld is crasht overigens op line 67,

Het kan aan mij liggen en dat ik nog niet genoeg van php weet om het te volgen, toch bedankt alvast voor de moeite :)
 
Niels K

Niels K

20/01/2010 13:18:00
Quote Anchor link
kevin damstra schreef op 20.01.2010 12:51:
Ja ik zie dat je het verschil overpakt in format dagen,
dus nadat het aantal weken zijn uitgerekend pak je hetgeen wat over is in het aantal dagen.

Maar daarna is de prijs het aantal weken * weektarief, ik zie het niet terug dat het rest wordt opgeteld bij het eerst bepaalde aantal weken.

Het script wat je hebt samengesteld is crasht overigens op line 67,

Het kan aan mij liggen en dat ik nog niet genoeg van php weet om het te volgen, toch bedankt alvast voor de moeite :)


Mmm, zoveel regels heeft het script niet eens, maar omdat je het in een bestaand script hebt geïmplementeerd zijn wellicht de regels anders. Misschien dat je even de regel kunt plaatsen waar het fout gaat?
 
- SanThe -

- SanThe -

20/01/2010 13:50:00
Quote Anchor link
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
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);

$aantal_huurdagen = 125;

$prijs = array(
    'losse_dag' => 5,
    'meerdag' => 4,
    'week' => 20,
    'maand' => 50
    );

$maandduur = 28;
$weekduur = 7;

$aantal_betaalmaanden = floor($aantal_huurdagen / $maandduur);
$aantal_betaalweken = floor(($aantal_huurdagen - ($aantal_betaalmaanden * $maandduur)) / $weekduur);
$aantal_betaalmeerdagen = floor(($aantal_huurdagen - ($aantal_betaalmaanden * $maandduur) - ($aantal_betaalweken * $weekduur)));
$aantal_betaaldagen = ($aantal_betaalmeerdagen > 0) ? 1 : 0;
$aantal_betaalmeerdagen = ($aantal_betaaldagen > 0) ? $aantal_betaalmeerdagen - 1 : 0;

$maand = ($aantal_betaalmaanden == 1) ? ' maand, ' : ' maanden, ';
$week = ($aantal_betaalweken == 1) ? ' week, ' : ' weken, ';
$meerdag = ($aantal_betaalmeerdagen == 1) ? ' meerdag en ' : ' meerdagen en ';
$dag = ($aantal_betaaldagen == 1) ? ' dag' : ' dagen';

$totaal_prijs = ($aantal_betaalmaanden * $prijs['maand']) + ($aantal_betaalweken * $prijs['week']) + ($aantal_betaalmeerdagen * $prijs['meerdag']) + ($aantal_betaaldagen * $prijs['losse_dag']);

echo 'Aantal dagen is: ' . $aantal_huurdagen . '<br/>';
echo 'Dat is: ' . $aantal_betaalmaanden . $maand . $aantal_betaalweken . $week . $aantal_betaalmeerdagen . $meerdag . $aantal_betaaldagen . $dag . '<br/>';
echo 'De kosten zijn: ' . number_format($totaal_prijs, 2, '.', '') . '<br/>';
?>
 
Kevin damstra

kevin damstra

20/01/2010 14:19:00
Quote Anchor link
Zonder if/ else?

Er is een kanttekening, de losse dag die voorkomt is alleen bij het huren van echt een losse dag.

Stel de klant heeft 4 weken, 4 meerdagen en 1 dag

dan komt hieruit (4*20) + (4*4) + (1*5), dit zou moeten zijn (4*20) + (5*4)
dus 5 meerdagen omdat in 129 dagen geen losse dag meer voor kan komen.

Daarnaast betaal ik bij 5 dagen de weekprijs en niet 4 meerdagen en 1 losse dag.

De weekprijs is 5,6 en 7 dagen dus dan is het niet mogelijk om weekduur een waarde mee te geven.

Ik zal hem ff uit pluizen en kijken of ik dat aan kan passen

Thnx
Gewijzigd op 01/01/1970 01:00:00 door kevin damstra
 
Kevin damstra

kevin damstra

20/01/2010 14:26:00
Quote Anchor link
Misschien een voorbeeld hoe het nu nog op papier gaat.

1 dag = losse_dag_prijs
5 dagen = week_prijs
7 dagen = week_prijs
9 dagen = (1*week_prijs) + (2*meerdagen_prijs)
11 dagen = (1*week_prijs + (4*meerdagen_prijs)
12 dagen = (2*week_prijs)
14 dagen = (2*week_prijs)
15 dagen = (2*week_prijs)+(1*meerdagen_prijs)

Daarnaast hebben wij het maandtarief geschrapt, dit komt maar eens in de zoveel jaren voor dat iemand zo lang huurt. daar is dan ook geen speciaal tarief voor nodig.
Gewijzigd op 01/01/1970 01:00:00 door kevin damstra
 
- SanThe -

- SanThe -

20/01/2010 14:28:00
Quote Anchor link
Aangepast.
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
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);

$aantal_huurdagen = 125;

$prijs = array(
    'losse_dag' => 5,
    'meerdag' => 4,
    'week' => 20
    );

$weekmax = 7;
$weekmin = 5;

$aantal_betaalweken = floor($aantal_huurdagen / $weekmax);
$aantal_betaalmeerdagen = floor(($aantal_huurdagen - ($aantal_betaalweken * $weekmax)));
$aantal_betaalweken = ($aantal_betaalmeerdagen >= $weekmin) ? $aantal_betaalweken + 1 : $aantal_betaalweken;
$aantal_betaalmeerdagen = ($aantal_betaalmeerdagen >= $weekmin) ? 0 : $aantal_betaalmeerdagen;
$aantal_betaaldagen = ($aantal_huurdagen == 1) ? 1 : 0;
$aantal_betaalmeerdagen = ($aantal_betaaldagen == 0) ? $aantal_betaalmeerdagen : 0;

$week = ($aantal_betaalweken == 1) ? ' week, ' : ' weken, ';
$meerdag = ($aantal_betaalmeerdagen == 1) ? ' meerdag en ' : ' meerdagen en ';
$dag = ($aantal_betaaldagen == 1) ? ' dag' : ' dagen';

$totaal_prijs = ($aantal_betaalweken * $prijs['week']) + ($aantal_betaalmeerdagen * $prijs['meerdag']) + ($aantal_betaaldagen * $prijs['losse_dag']);

echo 'Aantal dagen is: ' . $aantal_huurdagen . '<br/>';
echo 'Dat is: ' . $aantal_betaalweken . $week . $aantal_betaalmeerdagen . $meerdag . $aantal_betaaldagen . $dag . '<br/>';
echo 'De kosten zijn: ' . number_format($totaal_prijs, 2, '.', '') . '<br/>';
?>
Gewijzigd op 01/01/1970 01:00:00 door - SanThe -
 
Kevin damstra

kevin damstra

20/01/2010 14:56:00
Quote Anchor link
Heeeel erg bedankt,

Ik ga nu gewoon ff van alles testen, en voeg het formulier toe.
Als de databases zijn ingevuld met artikelen moet ook dat hiermee weer verrekend worden.

Stapje voor stapje komen we er wel,
 



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.