Resultaat uit functie onterecht positief
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)
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
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>";
?>
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
gap: 4
It fits
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.
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.
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!