Goedemiddag,

Ik heb een multidimensional array hierin zitten 12 arrays elk met 6 verschillende nummers. Nu wil ik deze array controleren met een variabele die willekeurige nummers genereer. Wanneer 6 nummers in 1 van de 12 arrays overeenkomen wil ik dat de functie stopt en de array opslaan zodat weer gegeven kan worden op het scherm.
Nu had ik al het een en ander gevonden op internet. Maar ik kom nu dus in een infinite loop terecht.
Iemand een idee hoe ik dit zou kunnen oplossen en wat ik fout heb gedaan?

<?php
mt_srand((double)microtime() * 1000000);

//lege bingokaart maken
$bingokaart = [];

//functie bingokaart vullen
function kaart_maken(){
//rijen vullen met willekeurige nummers
for($rij=1; $rij<=6; $rij++){
$bingokaart[$rij] = []; //de rij initialiseren
for($num=1; $num<=6; $num++){
//nummer aanmaken, en meteen controleren of ie al in de rij zit
while(in_array($nummer = $rij . rand(0,9), $bingokaart[$rij]));
//voeg nummer toe aan array
$bingokaart[$rij][$num] = $nummer;
}
}

//bingokaart-array uitbreiden met horizontale en verticale rijen door de horrizontale rijen te
//kantelen
$new_bingokaart = array();
foreach($bingokaart as $key => $subarr) {
foreach ($subarr as $subkey => $subvalue) {
$new_bingokaart[$subkey][$key] = $subvalue;
}
}

//bingokaart nummers en tabel printen
echo "<table border='1px black solid'>";
for($i=1; $i<=6; $i++){
echo "<tr>";
for($x=1; $x<=6; $x++){
echo "<td>" . $bingokaart[$i][$x] . "</td>";
}
echo "</tr>";
}
echo "</table><br>";
return array_merge($bingokaart, $new_bingokaart);;
}

//bingokaart printen
$bingokaart = kaart_maken();

$bingo = false;
$getal = rand(10, 69);
$getrokken_getallen = array();

while(!$bingo){
while(in_array($getal, $getrokken_getallen));
$getrokken_getallen[] = $getal;

for($rij=1; $rij<=12; $rij++){
for($rij_nr=1; $rij_nr<=6; $rij_nr++){
if($bingokaart[$rij][$rij_nr] == $getal){
$bingokaart[$rij][0] += 1;
if($bingokaart[$rij][6] == 6){
print "Bingo";
$bingo = true;
}
}
}
}
}

?>

Alvast bedankt voor de hulp.

Groeten Mario
//klopt het dat hier gegeken word of het randomnummer voorkomt?
Ja, zolang $randomNumber al voorkomt op de kaart zoeken we naar een nieuwe kandidaat, net zolang totdat we er een tegenkomen die er nog niet op staat. Deze voegen we dan toe en herhalen het proces totdat de hele kaart voorzien is van unieke nummers.

//en hier wanneer het false is, de loop opnieuw uitvoeren net zolang todat de kaart gevuld is?
Nee, dat is geen vergelijking, dat is een toekenning van een nog niet bestaand nummer ($randomNumber) aan de kaart. Deze sla ik op in de key, de value is false, die aangeeft dat het nummer nog niet afgestreept is. Als je een nieuwe kaart hebt/bouwt, is nog geen enkel nummer afgestreept. Ik sla $randomNumber op in de key zodat je dan heel snel (en efficiënt) dit nummer kunt inspecteren (en kunt afstrepen), en niet hoeft te gaan zoeken in $card met een in_array() operaties ofzo.

//waarom word hier vermenigvuldigd en opgeteld?
Ik maak er geen meerdimensionaal array van voor rijen en kolommen, maar zet de rijen achter elkaar. Elke kolom heeft dan een nieuwe "offset", namelijk de huidige rij, vermenigvuldigd met ... dat moet eigenlijk * $columns zijn denk ik, in plaats van $rows, waarschijnlijk :). Elke rij is namelijk $columns elementen lang.

//Klopt het dat door hier gebruik te maken van een ampersand dat de array gevuld word met random nummers?
$drawnNumbers (in de functie) is een parameter, deze representeert de variabele $drawnNumbers uit de globale scope (staat gedeclareerd op regel 79).

Het doel van deze parameter/variabele is dat je bijhoudt welke nummers al getrokken zijn. Bij het trekken van een nieuw nummer ga je ook hier weer net zolang door totdat je een nieuw nummber vindt. Deze wordt enerzijds toegevoegd aan de parameter in de functie, en daarmee aan de variabele $drawnNumbers uit de globable scope, en anderzijds geretourneerd via return.

Toegegeven, dat deze dezelfde naam hebben is wellicht verwarrend, maar doordat je de parameter aanroept met een ampersand wordt de variabele uit de globale scope (regel 79) dus direct aangesproken en kan deze dan ook rechtstreeks inhoudelijk worden aangepast. Normaal bestaan variabelen die je in een functie declareert niet buiten de functie, maar met een ampersand (of het keyword global, wat waarschijnlijk af te raden is) kun je een brug slaan tussen variabelen binnen de functie, en daarbuiten.

Het zou misschien zelfs nog handiger zijn als je hier objecten en klassen van maakt, want procedures (functies binnen een klasse) kunnen sowieso bij alle (eigen) klasse-variabelen.

EDIT: als ik zo in de gauwigheid kijk moeten er in de oorspronkelijke code misschien wat dingetjes worden aangepast:
- regel 30 $i*$rows moet $i*columns zijn
- ... hmm, dat wat het?
Het bovenstaande vormt trouwens geen probleem zolang de afmetingen van de kaart (rijen, kolommen) hetzelfde zijn.
Bedankt voor het verduidelijken van mijn vragen. Heb hier zeker wat aan. Objecten en klassen heb ik nog niet gehad. Maar dit komt nog wel aan de orde. Ik ga hier weer mee aan de slag.

Groeten Mario

Reageren