Resultaat uit functie onterecht positief

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Joop Korneel

Joop Korneel

25/01/2016 12:45:09
Quote Anchor link
Wat heb ik: Een script die stoelen suggereert afhankelijk van beschikbaarheid in een bioscoop ticket systeem. Afhankelijk van of het aantal gewenste bezoekers past in een gap worden stoelen toegewezen.
De beschikbaartheid van een stoel wordt als volgt aangegeven:
0 = bezet
1 = beschikbaar
x = stoel suggestie

Hoe wordt dat gedaan:
Eerst wordt er gekeken of de stoel beschikbaar is, is dat zo, dan markeert het de stoel beschikbaarheid met een 'x', afhankelijk van het aantal bezoekers. Voorbeeld: zijn er 6 bezoekers en zijn er 6 stoelen beschikbaar, dan krijgen deze opeenvolgend de waarde 'x'.

Wat is het probleem:
Ik heb een functie waarvan ik 'null' wil teruggeven als het gat ($gap) te klein is voor het aantal bezoekers. Voorbeeld(aantal bezoekers is 6, het gat is 4, dan zou het niet passen).
Op de een of andere manier klopt er iets niet aan mijn code want dit zelfde voorbeeld geeft aan dat het past, wat natuurlijk niet zo is.

Mijn vraag is volgt: Wat klopt er niet aan de code waardoor ik een positieve reactie in plaats van negatief krijg?


Mijn code:

Quote:
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?php
error_reporting(E_ALL & ~E_NOTICE);
$visitors = 6;
$seats = array(
    array(
        'seatAvailable' => '0',
        'seatNumber' => '1'
    ),        
    array(
        'seatAvailable' => '0',
        'seatNumber' => '2'
    ),        
    array(
        'seatAvailable' => '1',
        'seatNumber' => '3'
    ),        
    array(
        'seatAvailable' => '1',
        'seatNumber' => '4'
    ),        
    array(
        'seatAvailable' => '1',
        'seatNumber' => '5'
    ),              
);

$gap = 0;
echo "Visitors: ".$visitors;
 
function
suggestSeats($seats,$visitors){
    foreach($seats as &$val){
        //If available
        if($val['seatAvailable'] == '1'){
            //If there's no gap, start making one now:
            if($gap<1){
                $gap = 1;
            }

            $gap++;
            //IF THERE ARE STILL VISITORS TO PROCESS, MARK THE SUGGESTED SEAT
            if($visitors > 0) {
                $val['seatAvailable'] = 'x';
                $visitors--;
            }
        }

        //IF THERE ARE NO MORE VISITORS, EXIT LOOP
        if($visitors == 0) {
            break;
        }
    }

    echo "gap: ".$gap;

    //If the visitors fit in gap
    if($visitors<=$gap){
        $result = "<p>It fits</p>";
    }

    //If the visitors can't fit in the gap of available seats.
    else{
        $result = "<p>Doesn't fit</p>";
    }


    return $result;
}


echo "<pre>";
print_r (suggestSeats($seats,$visitors));
echo "</pre>";
?>


Output van huidig script:
Quote:
Visitors: 6

gap: 4

It fits
 
PHP hulp

PHP hulp

24/11/2024 17:11:51
 
Ward van der Put
Moderator

Ward van der Put

25/01/2016 13:08:13
Quote Anchor link
Volgens mij moet je dit anders aanvliegen als maximale bezetting het logistieke doel is.

Stel, je hebt een gat van 6 stoelen en verderop een gat van 4 stoelen. Als er dan 3 bezoekers komen, wil je niet het eerste gat (van 6 stoelen) reserveren, maar het kleinste gat (van 4 stoelen). Dit betekent dat je éérst een compleet overzicht moet hebben van alle gaten. Maak daarvoor bijvoorbeeld een geïndexeerde array met het eerste stoelnummer als de index en het aantal plaatsen als de waarde.
 
Thomas van den Heuvel

Thomas van den Heuvel

25/01/2016 14:41:27
Quote Anchor link
Ook controleert bovenstaande code niet of het gat een aaneengesloten rij stoelen betreft.

En zelfs als dit het geval is, wil dat niet zeggen dat de stoelen naast elkaar staan als deze onderdeel uitmaken van verschillende rijen, bijvoorbeeld 2 vrije stoelen aan het einde van rij 1 en 3 vrije stoelen aan het begin van rij 2 is niet 5 (fysiek) aaneegesloten vrije plaatsen.

Ook controleer je niet of $visitors na afloop 0 is (dus of je alle visitors hebt geteld). Dus na afloop heb je of alle bezoekers verdeeld over stoelen (die niet per se naast elkaar staan omdat je niet bijhoudt of het een aaneengesloten rij betreft) of het restant niet-getelde bezoekers is kleiner dan het aantal vrije plaatsen, dat garandeert volgens mij niet eens dat iedereen een zitplaats heeft :). Stel dat je 5 bezoekers hebt en 3 vrije zitplaatsen, volgens mij is dan na afloop $visitors gelijk aan 2 en $gap gelijk aan 3, er zal dan ten onrechte geconcludeerd worden dat het past :).

De strategie van Ward is mogelijk beter. Maak allereerst een inventarisatie van alle aaneengesloten vrije stoelen en gebruik dat als uitgangspunt.
 
Joop Korneel

Joop Korneel

26/01/2016 00:12:17
Quote Anchor link
Beste heren, hartelijk bedankt voor de snelle reactie.
Ik heb het probleem op kunnen lossen, de waarde waar ik op testte was $visitors en $gap, het moest aan 1 van beide liggen.

Het blijkt $visitors te zijn, ik heb $visitors een waarde van 6 gegeven, de functie verdeelt deze 6x en trekt elke keer 1 hiervan af wanneer deze een beschikbare stoel tegenkomt en toevoegt als suggestie.

Op het moment dat ik $visitors wilde laten zien heeft het deze actie al uitgevoerd waardoor de waarde altijd minder is, mits er een aantal beschikbare stoelen zijn.

Op het moment dat ik de waarde van $visitors wilde gaan gebruiken klopt het dus niet meer. De oplossing: ik heb een tijdelijk variabele gemaakt ($visitorsToProcess = $visitors), deze enkel gebruikt in de opgegeven functie en verder $visitors ongemoeid gelaten. Hierdoor is de waarde van $visitors consistent gebleven. Opgelost dus en werkt verder naar behoren, nu moet ik alle suggesties opslaan in de database maar mocht het nodig zijn open ik daar een nieuwe topic voor ;)

Fijne avond!
 



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.